Prolog:不平等运算符

时间:2013-11-15 20:42:47

标签: 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'). 

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

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

但是,当我输入时:

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

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

2 个答案:

答案 0 :(得分:7)

改为使用dif/2,或在规则末尾设置\== - 这不如dif/2安全。另见:

Difference between X\=Y and dif(X,Y)

What is the logical 'not' in Prolog?

Using \==/2 or dif/2

答案 1 :(得分:5)

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

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

此外:

?- S1 \== S2.
true.

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