我试图在给定列表的情况下生成每种可能的组合。我希望每个[X,Y]组合都可以 这是一个例子:
?- arguments(A,[1,2,3]).
A = [1,2] ; A = [1,3] ; A = [2,1] ; A = [2,3] ; A = [3,1] ;
A = [3,2]
我尝试了很多东西,但我还没有找到合适的东西。 我很确定这个想法是使用prolog的能力来尝试各种可能性:
element(X,[X|_],1).
element(X,[_|Q],N) :- element(X,Q,NewN), N is NewN + 1.
该谓词可以返回位置N处的元素,或者返回元素X的位置,或者生成每种可能性。例如:
?- element(X,[a,b,c],N).
N = 1
X = a
N = 2
X = b
N = 3
X = c
感谢您的帮助。
编辑以下gusbro回答:
我不能使用现有的谓词,它是课程的一部分
读到你的答案后,我想出了这个:
remove_element_x(X, [X|Q], Q).
remove_element_x(X, [T|Q], [T|Res]) :- remove_element_x(X,Q,Res).
arguments([X,Y],L) :-
element(X,L,_),
remove_element_x(X,L,L2),
element(Y,L2,_).
remove_element_x / 3从列表中删除元素x并返回新列表。 但回溯不起作用:
?- arguments(A,[1,2,3]).
A = [1,2] ?
yes
答案 0 :(得分:2)
您可以使用select/3
从列表中选择一个元素(并获取剩余的列表),然后再次执行以从剩余列表中选择另一个元素。
即:
arguments([A,B], L):-
select(A, L, L1),
select(B, L1,_).
测试用例:
?- arguments(A,[1,2,3]).
A = [1, 2] ;
A = [1, 3] ;
A = [2, 1] ;
A = [2, 3] ;
A = [3, 1] ;
A = [3, 2]