Prolog 获取子句的其余部分作为列表并创建列表列表

Prolog 获取子句的其余部分作为列表并创建列表列表,prolog,Prolog,假设我有一些条款,其中两条如下: 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], ['bigBaske

假设我有一些条款,其中两条如下:

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']]
我们可以利用:

所有_篮(S,L):-
findall([A,B,C])有一个篮子(S,A,B,C,L)。

<代码> >代码> [a,b,c] < /c>是列表中的项目的“模板”,<代码> HasyB篮(s,a,b,c)< /c>需要填充的“目标”,和<代码> L>代码>结果列表。

每当考虑Prolog编程问题时,你需要阐明对你很重要的方面。

  • 考虑一下列表中两个元素的顺序。它们是按字母顺序升序排列的,还是只是运气

  • 你对
    所有的篮子('Nemo',L)
    有什么期望?如果失败,或者更确切地说是回答
    L=[]

  • 你对
    所有的篮子(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]].
    
    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]].