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.
'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
@lurker Sorry, große Kopie-Paste Tippfehler. Korrigiert, aber immer noch kein Ergebnis. –