如何以不同方式组合列表的元素

时间:2016-05-16 18:07:43

标签: prolog

我想旅行这种类型的列表:[worker1(J, 10), worker2(T, 20), worker3(P, 30)]. ,首先从头开始,将它与下一个元素相结合,直到结束,如果在那一点上我没有达到解决方案(我的问题受到工人来的顺序的影响),那么我想从头开始另一个工人,并探索所有其他选择。

我不确定是否有一种简单的方法可以做到这一点,但现在是我必须尝试解决练习的唯一方法,所以我想在这里问一下。到目前为止我所知道的问题是我会这样旅行:

w1-w2,w1-w3,w1-w4

如果失败,通过递归,我会跳过头并且会:

w2-w3,w2-w4

但不是w2-w1,所以我会错过可能的解决方案。在环顾四周时我什么都没找到,所以我的假设是我没有使用正确的术语

1 个答案:

答案 0 :(得分:2)

如果您使用Google" prolog组合列表",您将找到Prolog Guide - Combinatorics。这里显示的谓词略有变化,会生成给定列表N的{​​{1}}个元素的子列表:

L

要获得您追求的所有对,您可以使用以下方式调用:

comb(0, _, []).
comb(N, [X|T], [X|Comb]) :-
    N #> 0,
    N1 #= N - 1,
    comb(N1, T, Comb).
comb(N, [_|T], [X|Comb]) :-
    N #> 0,
    comb(N, T, [X|Comb]).

例如:

comb(2, List, Comb).

如果你想要短划线对,你可以用以下方式映射它们:

| ?- comb(2, [a,b,c,d], R).

R = [a,b] ? a

R = [a,c]

R = [a,d]

R = [b,c]

R = [b,d]

R = [c,d]

no