【问题标题】:gnu Prolog powerset modificationgnu Prolog powerset 修改
【发布时间】:2010-11-10 15:35:06
【问题描述】:

所以我得到了这个用于 powerset:

powerset([], []).
powerset([H|T], P) :- powerset(T,P).
powerset([H|T], [H|P]) :- powerset(T,P).

这会生成一个列表的所有集合。是否可以按列表顺序生成所有集合。

例子:

List = [a,b,c]

我想得到

[a],[a,b],[a,b,c],[b],[b,c],[c]

请注意,此子集列表中没有[a,c],因为这些子集是从左到右的子集。

我尝试过使用追加和递归的组合,但并没有达到我想要的效果。在这一点上有点难过。

谢谢。

【问题讨论】:

    标签: list prolog set substring dcg


    【解决方案1】:

    怎么样

    powerset(L, [H|T]):-
      append([H|T], _, L).
    powerset([_|L], P):-
      powerset(L, P).
    

    【讨论】:

    • 谢谢!这就说得通了。我很接近。似乎总是如此。
    • 不会产生完整的powerset。例如,当被问及 [a, b, c] 的幂集是什么时,它无法产生 [a, c]。
    • @RasmusJ:你看到这个问题了吗?它明确指出 [a,c] 不应该是输入 [a,b,c] 的答案。 OP 想要“按列表顺序设置”(检查 OP 示例输入/输出以进行澄清)
    【解决方案2】:

    您想要所有 子序列 子字符串 (definition)。语法 (DCG) 最适合:

    
    seq([]) -->
       [].
    seq([E|Es]) -->
       [E],
       seq(Es).
    
    ... --> [] | [_], ... .
    
    ?- Es = [_|_], phrase((..., seq(Es), ...), [A,B,C]).
    Es = [A] ;
    Es = [A, B] ;
    Es = [A, B, C] ;
    Es = [B] ;
    Es = [B, C] ;
    Es = [C] ;
    false.
    

    (SWI-序言)

    【讨论】:

      【解决方案3】:

      我知道这是一篇旧帖子,但我不会无缘无故地更新它。 被所有方面接受的答案,可分离地生成所有子集,并且不生成幂集。

      几天前我试图实现一个powerSet/2 谓词,而不使用内置谓词bagof/2。但即使使用bagof/2setof/2,对于初学者来说也不是很容易的问题(单独生成所有子集是另一个问题,而且容易得多)。所以在实施解决方案后,我认为最好把它放在这里,以防止搜索这个主题的人出错。

      我的解决方案(没有bagof/2

      生成(X,[Y],[[X|Y]])。 生成(X,S,P):- S = [H| T], 附加([X],H,温度), 生成(X,T,休息), 追加([温度],休息,P),!。 电源集([],[[]])。 电源组(设置,P):- 设置 = [H| T], 幂集(T,PST), 生成(H,PsT,Ps), % write('试图推送'), print(H), write(' to '), % write('powerset的所有元素'), print(T), write('即'), % 打印 (PsT), nl, % write('结果是'), print(Ps), nl, nl, 追加(Ps,PsT,P),!。

      如果参考注释行,代码将被理解。

      另一个解决方案是here,它使用内置谓词bagof/3

      现在可能会更有帮助。

      【讨论】:

        【解决方案4】:

        这个怎么样:

        powerset(A,B):-
            append(A,_,B);
            append(_,A,B).
        
        test():-
            setof(X,powerset(X,[1,2,3]),L),
            writeln(L).
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-09
          • 2017-03-23
          • 1970-01-01
          • 2020-04-02
          • 2011-05-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多