2013-11-15 11 views
5

Sto usando SICStus Prolog e hanno una serie di fatti:Prolog: disuguaglianza operatore

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

voglio ottenere l'oggetto condiviso di due studenti in cui entrambi gli studenti sono diversi, così ho preso:

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

Tuttavia, quando entro:

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

ottengo F = 'John Henry'. Qualcuno può indicare dove sto sbagliando e cosa devo fare? Grazie.

+0

Entrambe le buone risposte. Ho scelto quello di Paulo a causa della spiegazione. Non ho pensato prima alla istanziazione. – Hydar77

risposta

5

è necessario spostare l'obiettivo S1 \== S2 fino alla fine come. Se si chiama il sharedSubject/3 predicato con il secondo argomento non istanziati, come nella vostra sharedSubject('John Henry', F, E), l'obiettivo S1 \== S2 sarà sempre vero:

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

anche:

?- S1 \== S2. 
true. 

Vedere la documentazione dello standard (\==)/2 built -in predicato nella documentazione del sistema Prolog. In poche parole, a meno che non si voglia testare se due variabili sono uguali, assicurarsi che entrambi gli argomenti siano istanziati quando si chiama questo predicato uguaglianza.