6

我正在使用 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'。有人可以指出我哪里出错了,我需要做什么?谢谢。

4

2 回答 2

8

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

X\=Y 和 dif(X,Y) 的区别

Prolog 中的逻辑“非”是什么?

使用 \==/2 或 diff/2

于 2013-11-15T21:21:12.570 回答
7

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

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

还:

?- S1 \== S2.
true.

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

于 2013-11-15T21:22:37.987 回答