假设我有一些子句,其中两个如下:
has_basket('Sarah', 'bigBasket','apple','grape').
has_basket('Sarah', 'bigBasket','orange','berry').
如何写一个名为
的规则all_baskets(S,L).
哪个会给我以下表格中的人 S 拥有的所有篮子的列表? 例如
all_baskets('Sarah',L).
会给我们:
L=[['bigBasket','apple','grape], ['bigBasket','orange','berry']]
最佳答案
每当您考虑 Prolog 编程问题时,您都需要阐明对您来说重要的方面。
考虑列表中两个元素的顺序。它们的顺序是因为它们按字母升序排列,还是只是运气?
您对
all_baskets('Nemo', L)
有什么期望?这应该失败,还是回答L = []
?您对
all_baskets(P, [])
有什么期望?
如果你说 1 个字母顺序,2 个失败,3 个失败,那么 setof/3
就是要走的路。
has_basket('Sarah', bigBasket, apple, grape).
has_basket('Sarah', bigBasket, orange, berry).
has_basket('Bernie', bigBasket, orange, apple). % another fact
all_baskets(P, L) :-
setof([A, B, C], has_basket(P, A, B, C), L).
?- all_baskets(P, []).
false.
?- all_baskets('Nemo', L).
false.
?- all_baskets(P, L).
P = 'Bernie', L = [[bigBasket,orange,apple]]
; P = 'Sarah', L = [[bigBasket,apple,grape],[bigBasket,orange,berry]].
关于prolog - 获取子句的其余部分作为列表并创建列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58261044/