如何为给定列表生成每个[X,Y]?

时间:2016-06-17 13:55:13

标签: prolog

我试图在给定列表的情况下生成每种可能的组合。我希望每个[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

1 个答案:

答案 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]