4

我想写一个 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然而,这个谓词在equals时也是正确的Y,我不希望这样。谁能帮我找到解决方案?一个小的解释也将不胜感激。

4

2 回答 2

2

您可以使用谓词dif/2来声明X并且Y不能相等:

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

这使得解释器认识到这一点X并且Y需要是两个不同的实体才能使same_hobby/2谓词为真。

于 2015-12-08T05:49:48.937 回答
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),否则失败。

于 2015-12-07T18:05:21.710 回答