当两个人有相同的爱好时,Prolog谓词返回true

时间:2015-12-07 12:46:27

标签: prolog prolog-dif

我想写一个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时,这个谓词也是如此,我不希望如此。任何人都可以帮我找到解决方案吗?一个小的解释也将非常感激。

2 个答案:

答案 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来声明XY不能相等:

same_hobby(X, Y) :-
    likes(X, Z),
    likes(Y, Z),
    dif(X, Y).

这使得解释器认识到XY需要是两个不同的实体才能使same_hobby/2谓词成立。