Prolog中两个人之间的一个共同爱好

One common hobby between two persons in Prolog

我发现这个老问题 (Prolog Predicate to return true when two people have same hobby) 是为了编写一些代码来使用 dif 查找两个人之间的相同爱好。我有类似的情况,显示两个具有相同爱好的人的名字,但爱好元素被定义为一个列表。无论我尝试什么,它似乎都不起作用,任何想法将不胜感激。

这是我目前拥有的:

one_common_hobby(P1,P2):-
dif(P1,P2),
person(P1,_,_,hobbies([H|Tail])),
person(P2,_,_,hobbies([H|Tail])),
member(P1,Tail),
member(P2,Tail).

为简单起见,假设谓词person定义如下:

person(ann, hobbies([fishing, pottery, chess])).
person(bob, hobbies([parkour, painting, origami])).
person(coy, hobbies([hunting, fishing, parkour, chess])).

要找到具有共同爱好的两个不同的人(P1P2),您必须:

  • 访问第一人称的爱好列表(H1)。
  • 访问第二个人(H2)的爱好列表。
  • 检查是否至少有一项爱好 X 同时属于列表 H1H2
have_common_hobby(P1, P2) :-
    dif(P1, P2),
    person(P1, hobbies(H1)),
    person(P2, hobbies(H2)),
    once( ( member(X, H1),
            member(X, H2) ) ).

示例:

?- have_common_hobby(A, B).
A = ann,
B = coy ;
A = bob,
B = coy ;
A = coy,
B = ann ;
A = coy,
B = bob ;
false.