4

否定を使わずに、2 人が同じ趣味を持っている場合に true を返す Prolog 述語を書きたいと思います。次のデータベースがあります。

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であり、私はこれが当てはまりたくありません。誰でも解決策を見つけるのを手伝ってもらえますか? 小さな説明も大歓迎です。

4

2 に答える 2

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 と異なる場合は、likes(X,Z), likes(Y,Z) という目標を減らし、それ以外の場合は失敗します。

于 2015-12-07T18:05:21.710 に答える