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])).
要找到具有共同爱好的两个不同的人(P1
和 P2
),您必须:
- 访问第一人称的爱好列表(
H1
)。
- 访问第二个人(
H2
)的爱好列表。
- 检查是否至少有一项爱好
X
同时属于列表 H1
和 H2
。
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.
我发现这个老问题 (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])).
要找到具有共同爱好的两个不同的人(P1
和 P2
),您必须:
- 访问第一人称的爱好列表(
H1
)。 - 访问第二个人(
H2
)的爱好列表。 - 检查是否至少有一项爱好
X
同时属于列表H1
和H2
。
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.