Prolog:不平等运算符

Hyd*_*r77 6 prolog prolog-dif

我正在使用SICStus Prolog并拥有一系列事实:

student('John Henry', 'Maths').
student('Jim Henry', 'Maths').
student('John Alan', 'Maths').
student('Alan Smith', 'Computing').
student('Gary Henry', 'Maths'). 
Run Code Online (Sandbox Code Playgroud)

我想得到两个学生的共同主题,两个学生都不同,所以我得到了:

sharedSubject(S1, S2, Sub) :- S1 \== S2, student(S1, Sub), student(S2, Sub).
Run Code Online (Sandbox Code Playgroud)

但是,当我输入:

sharedSubject('John Henry', F, E).                     
Run Code Online (Sandbox Code Playgroud)

我得到F = 'John Henry'.有人可以指出我出错的地方以及我需要做什么吗?谢谢.

fal*_*lse 7

dif/2改为使用,或者\==在规则的末尾设置- 这不如安全dif/2.也可以看看:

X\= Y和dif(X,Y)之间的差异

Prolog的逻辑"不"是什么?

使用\ ==/2或dif/2


Pau*_*ura 5

你必须把S1 \== S2目标移到最后.如果sharedSubject/3使用未实例化的第二个参数调用谓词,就像在您的实例中一样sharedSubject('John Henry', F, E),S1 \== S2目标将始终为真:

?- 'John Henry' \== S2.
true.
Run Code Online (Sandbox Code Playgroud)

也:

?- S1 \== S2.
true.
Run Code Online (Sandbox Code Playgroud)

请参阅(\==)/2Prolog系统文档中标准内置谓词的文档.简而言之,除非您想测试两个变量是否相同,否则请确保在调用此术语等式谓词时实例化两个参数.