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:此标题更改没有帮助。