List 返回列表:Prolog

List 返回列表:Prolog,list,prolog,List,Prolog,我试图创建一个谓词,返回所有女性的列表。到目前为止,我已经: female(elisabeth). female(queenmother). female(diana). female(anne). female(beatrice). female(sarah). female(zara). female(kate). the_royal_females([X|_]). the_royal_females([X|_]) :- female(X). 但这会让每一位女性都如愿以偿 X = eli

我试图创建一个谓词,返回所有女性的列表。到目前为止,我已经:

female(elisabeth).
female(queenmother).
female(diana).
female(anne).
female(beatrice).
female(sarah).
female(zara).
female(kate).

the_royal_females([X|_]).
the_royal_females([X|_]) :- female(X).
但这会让每一位女性都如愿以偿

X = elisabeth ;
X = queenmother ;
X = diana ;

如何让它返回
[elisabeth,QueenMoher,diana]

您可以使用
findall/3

the_royal_females(Lst):-findall(F,female(F),Lst).

findall
放入
Lst
所有
F
得到的实例化,同时尽可能满足
female(F)

@false为什么?我通常避免使用
setof/3
,因为当目标无法满足时,它返回false而不是
[]
。因为
findall/3
显示解决方案的意外顺序,而
setof/3
隐藏它们。和
setof/3
也适用于更一般的查询等。将
female(F)
替换为
gender(F,female)
。然后用
Gender
替换
female
,对查询进行概括
findall/3
中断,而
setof/3
保持正确。我知道这些差异,但我认为它们与这个特定问题无关。我不认为
findall/3
在这种情况下会中断,它只是不关心自由变量。因此,当我没有涉及其他自由变量并且我不关心排序时,我总是使用
findall/3
,因为它在目标根本不成功时起作用。这就成功了。Thanks@BhargavRao:此标题更改没有帮助。