2016-04-28 7 views
0

So habe ich eine einfachere Variante des Einstein/Zebra-Puzzle in Prolog.Alter Constraint Finding

enter image description here

Und ich kam mit dieser möglichen Lösung:

b_setval(T_age, Var). 
friends(L) :- 
    L = [person(A1, B1, T_age), person(A2, B2, C2), person(A3, B3, T_age+3)], 
    : 
    : 
    member(person(_,yang,T_age+3),L), 
    member(person(_,_,18),L). 

Aber meine Abfrage friends(L). - false. gibt nur false wie angegeben. Was mache ich falsch?

+1

'L' ist eine Liste von Begriffen, die wie' person (...) '(' person/3') aussehen. Einige deiner 'member'-Checks suchen nach Begriffen in' L', die aussehen wie 'h (...)', die nicht in 'L' existieren, also werden diese fehlschlagen. Außerdem haben einige Ihrer 'member'-Checks 3 Argumente (* z. B. *,' member (h, (_, _, 15), L) ') und diese erzeugen einen Fehler. – lurker

+0

@lurker Sorry, große Kopie-Paste Tippfehler. Korrigiert, aber immer noch kein Ergebnis. –

Antwort

1

Nachdem im Anschluss an die Antwort von @luker, können Sie Ihre Antwort

friends(L) :- 
    % 1 
    L = [person(ada, _, Ta), person(ama, _, _), person(ana, _, _)], 
    % 2 
    member(person(_,_,15), L), 
    member(person(_,_,17), L), 
    member(person(_,_,18), L), 
    % 3 
    member(person(_, chang, _), L), 
    % 4 
    member(person(_, yang, Ty), L), Ty is Ta + 3, 
    % 5 
    member(person(_, thatcher, 17), L). 

Interessante überprüfen, erzeugt diese 2 Ergebnisse, die für diese Art von Problem ist seltsam.

+0

Es gab einige Fehler in meiner Variablenbenennung, aber schließlich habe ich es verstanden! –

1

Ein potenzielles Problem, das herausragt, ist der T_age+3 Begriff in der Liste L. In Prolog wird dies nicht arithmetisch in-line ausgewertet. Es wird einfach der Begriff '+'(T_age,3) sein. Das einzige Element, das diesem Mitglied der Liste entspricht, wäre ein Ausdruck, der wie folgt aussieht: person(X, Y, <something>+3). Es ist unklar, ob dies deine Absicht ist.

Sie können eine trace tun, um zu sehen, wie Variablen mit jedem member Anruf instanziiert werden, aber wir versuchen, dies zu illustrativen Zwecken manuell zu tun:

L = [person(A1, B1, T_age), person(A2, B2, C2), person(A3, B3, T_age+3)], 
member(person(ada, _,T_age),L), 
... 

Dieser member Aufruf gelingen sollte, weil Prolog es person(A1, B1, T_age) mithalten können in der Liste durch Vereinigung A1 = ada. Die Liste L sieht nun wie:

[person(ada, B1, T_age), person(A2, B2, C2), person(A3, B3, T_age+3)] 

zum nächsten member Aufruf Moving on:

member(person(ama, _, _),L), 
... 

Dies kann das erste Element nicht übereinstimmen, sondern durch die Vereinheitlichung A2 = ama den zweiten mithalten können. L ist jetzt:

[person(ada, B1, T_age), person(ama, B2, C2), person(A3, B3, T_age+3)] 

Dann haben Sie:

member(person(ana, _, _),L), 

dies nicht das erste oder das zweite Element übereinstimmen, aber die dritte A3 = ana durch Vereinheitlichung mithalten können. L ist jetzt:

[person(ada, B1, T_age), person(ama, B2, C2), person(ana, B3, T_age+3)] 

Der nächste member Aufruf ist:

member(person(_,chang, _),L), 

, die das erste Mitglied wieder B1 = chang durch die Vereinheitlichung mithalten können, so L wird:

[person(ada, chang, T_age), person(ama, B2, C2), person(ana, B3, T_age+3)] 

Dann

member(person(_,yang,T_age+3),L), 

Dies entspricht dem zweiten Element der Liste, indem B2 = yang und C2 = T_age+3 vereinheitlicht werden.L wird dann:

[person(ada, chang, T_age), person(ama, yang, T_age+3), person(ana, B3, T_age+3)] 

Dann

member(person(_,thatcher,17),L), 

Hier können Sie einige Probleme haben. Es kann nicht die ersten beiden Elemente von L wegen des zweiten Arguments übereinstimmen. Das dritte Argument kann nicht mit dem Ausdruck T_age+3 im dritten Element L übereinstimmen. Denken Sie daran: Prolog löst das nicht als Gleichung T_age+3 = 17. Es wird nur 17 als atomare Ganzzahl angezeigt, und sehen Sie T_age+3 als ein Begriff mit zwei Argumenten und finden Sie, dass sie nicht übereinstimmen. So schlägt dieser member Aufruf fehl, und das gesamte Prädikat schlägt fehl.

+0

Meine Absicht ist es, Alter, das 3 mehr als einige andere Personen Alter ist übereinzustimmen! Meine Konzepte sind jetzt ziemlich klar! Kannst du einen möglichen Weg vorschlagen, um eine Lösung zu erreichen, damit ich eine mögliche Person erreichen kann? Danke vielmals! –

+0

Ich habe eine andere Version basierend auf Ihren Vorschlägen gepostet, die auch nicht funktioniert :( –

+0

@jeet meinst du, es scheitert einfach? Folge dem Vorschlag in meiner Antwort und mache entweder eine "Spur" oder gehe durch sie hindurch wie ich denke, ich habe deine ursprüngliche Frage beantwortet, also wenn du meine Antwort auf diese Frage als akzeptabel empfindest, könntest du sie vielleicht annehmen :) In deinem Update ist der Ausdruck 'member (person (_, yang, Y), Y ist X + 3) , L) .' ist ein Fehler, weil Sie 3 Argumente an "member/2" übergeben. Ebenfalls,. "Y ist X + 3" wird in diesem Zusammenhang als Ausdruck interpretiert ("ist (+ (X, 3), L)"). Wie ich bereits in meiner Antwort erwähnt habe, wertet Prolog Ausdrücke nicht direkt aus, es sei denn, Sie verwenden eine bestimmte arithmetische Auswertung. – lurker