我想旅行这种类型的列表:[worker1(J, 10), worker2(T, 20), worker3(P, 30)].
,首先从头开始,将它与下一个元素相结合,直到结束,如果在那一点上我没有达到解决方案(我的问题受到工人来的顺序的影响),那么我想从头开始另一个工人,并探索所有其他选择。
我不确定是否有一种简单的方法可以做到这一点,但现在是我必须尝试解决练习的唯一方法,所以我想在这里问一下。到目前为止我所知道的问题是我会这样旅行:
w1-w2,w1-w3,w1-w4
如果失败,通过递归,我会跳过头并且会:
w2-w3,w2-w4
但不是w2-w1,所以我会错过可能的解决方案。在环顾四周时我什么都没找到,所以我的假设是我没有使用正确的术语
答案 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