代码之家  ›  专栏  ›  技术社区  ›  PrinceOfBorgo

子集和列表Prolog

  •  1
  • PrinceOfBorgo  · 技术社区  · 7 年前

    给出一个列表 L 对于自然数,我需要创建一个列表,其中包含 L . 例如,如果 L=[1,3,6] 我想获取列表 [0,1,3,4,6,7,9,10] .

    我试图使用此代码

    subsetSums(List,Sums) :- findall(Sum,(subset(Sub,List),sum_list(Sub,Sum)),Sums).
    

    但通过以下查询,我得到 [0] 作为唯一的结果,而不是 [0,1,2,3]

    ?- subsetSums([1,2],Sums).
    

    我错在哪里?

    编辑:我正在编写SWI Prolog和 subset/2 应为本机谓词。

    1 回复  |  直到 7 年前
        1
  •  2
  •   damianodamiano    7 年前

    正如评论中所建议的,你必须自己写 subset/2 谓词,然后使用 findall/3 在这个谓词上,如下所示:

    subset([], []).
    subset([E|T], [E|T1]):-
      subset(T, T1).
    subset([_|T], L):-
      subset(T, L).
    
    subsetSums(List,Sums) :- 
        findall(S,(subset(List,Sub),sumlist(Sub,S)),Sums).
    
    ?- subsetSums([1,2],L).
    L = [3, 1, 2, 0]
    ?- subsetSums([1,2,3],L).
    L = [6, 3, 4, 1, 5, 2, 3, 0]
    

    其中的输出 子集/2 是:

    subset([1,2,3],L).
    L = [1, 2, 3]
    L = [1, 2]
    L = [1, 3]
    L = [1]
    L = [2, 3]
    L = [2]
    L = [3]
    L = []