我想写一个Prolog谓词,当两个人有相同的爱好而不使用否定时返回true。我有以下数据库:
likes(john,movies).
likes(john,tennis).
likes(john,games).
likes(karl,music).
likes(karl,running).
likes(peter,swimming).
likes(peter,movies).
likes(jacob,art).
likes(jacob,studying).
likes(jacob,sleeping).
likes(mary,running).
likes(mary,sleeping).
likes(sam,art).
likes(sam,movies).
我想出了以下谓词:
same_hobby(X,Y) :-
likes(X,Z),
likes(Y,Z).
然而,当X
等于Y
时,这个谓词也是如此,我不希望如此。任何人都可以帮我找到解决方案吗?一个小的解释也将非常感激。
答案 0 :(得分:2)
您可以简单地使用谓词 dif / 2 ,即dif(Term1,Term2),这意味着Term1必须与Term2不同,否则它将失败。 你的规则将成为:
same_hobby(X,Y) :-
likes(X,Z),
likes(Y,Z),
dif(X,Y).
原因dif / 2是完全纯的谓词,您也可以将其写为
same_hobby(X,Y) :-
dif(X,Y),
likes(X,Z),
likes(Y,Z).
这意味着,如果X与Y不同,则减少目标(X,Z),喜欢(Y,Z),否则失败。
答案 1 :(得分:2)
您可以使用谓词dif/2
来声明X
和Y
不能相等:
same_hobby(X, Y) :-
likes(X, Z),
likes(Y, Z),
dif(X, Y).
这使得解释器认识到X
和Y
需要是两个不同的实体才能使same_hobby/2
谓词成立。