2013-11-15 16 views
5

I SICStus Prolog verwenden und eine Reihe von Fakten hat:Prolog: Ungleichheitsoperator

student('John Henry', 'Maths'). 
student('Jim Henry', 'Maths'). 
student('John Alan', 'Maths'). 
student('Alan Smith', 'Computing'). 
student('Gary Henry', 'Maths'). 

ich das gemeinsame Thema von zwei Studenten erhalten möge, wo beiden Schüler unterschiedlich sind, so hat ichduersiees:

sharedSubject(S1, S2, Sub) :- S1 \== S2, student(S1, Sub), student(S2, Sub). 
jedoch

, wenn ich ein:

sharedSubject('John Henry', F, E).      

ich F = 'John Henry'. Kann jemand darauf hinweisen, wo ich falsch liege und was ich tun muss? Vielen Dank.

+0

Beide gute Antworten. Ich wählte Paulos wegen der Erklärung. Ich habe nicht vorher über die Instanziierung nachgedacht. – Hydar77

Antwort

5

Sie müssen das S1 \== S2 Ziel bis zum Ende bewegen. Wenn Sie Ihr sharedSubject/3 Prädikat mit dem zweiten Argumente nicht instanziiert nennen, wie in Ihrem sharedSubject('John Henry', F, E), das S1 \== S2 Ziel wird immer wahr sein:

?- 'John Henry' \== S2. 
true. 

auch:

?- S1 \== S2. 
true. 

die Dokumentation des Standard (\==)/2 Siehe gebaut -in Prädikat in Ihrer Prolog-Systemdokumentation. Kurz gesagt, wenn Sie nicht testen möchten, ob zwei Variablen gleich sind, stellen Sie sicher, dass beide Argumente instanziiert werden, wenn Sie diesen Begriff Gleichheit Prädikat aufrufen.