谓词必须适用于列表中的所有元素

na8*_*899 0 prolog

我有一套事实:

likes(john,mary).
likes(mary,robert).
likes(robert,kate).
likes(alan,george).
likes(alan,mary).
likes(george,mary).
likes(harry,mary).
likes(john,alan).
Run Code Online (Sandbox Code Playgroud)

现在我想编写一个关系,如果likes(X,A)为true ,将检查输入列表的所有元素X. 如果likes(X,A)我的列表L中的所有元素X都为真,那么我的关系应该返回true .如果我试试这个:

relat(X) :- member(A,[john,alan,george,harry]), likes(A,X).
Run Code Online (Sandbox Code Playgroud)

但输出是

?- relat(mary).
true ;
true ;
true ;
true.
Run Code Online (Sandbox Code Playgroud)

我想写它,一旦发现likes(john,mary),likes(alan,mary),likes(george,mary),likes(harry,mary)所有都是真的,它返回一个真.如何解决这个问题?

Fre*_*Foo 5

在SWI-Prolog中,您可以使用forall/2:

?- forall(member(A, [john, alan, george, harry]), likes(A, mary)).
true.
?- forall(member(A, [john,alan,george,harry,marys_ex]), likes(A, mary)).
false.
Run Code Online (Sandbox Code Playgroud)