Chuck
Chuck

Reputation: 391

How to generate every [X,Y] possible for a given list?

I'm trying to generate every combination possible given a list. I want every [X,Y] combination possible.
Here's an example :

?- arguments(A,[1,2,3]).  
A = [1,2] ; A = [1,3] ; A = [2,1] ; A = [2,3] ; A = [3,1] ;
A = [3,2] 

I have tried multiple things, but I've yet to find a working one. I am pretty sure the idea is to use prolog's ability to try every possibility as such :

element(X,[X|_],1).
element(X,[_|Q],N) :- element(X,Q,NewN), N is NewN + 1. 

This predicate can return the element at the position N, or return the position of the element X, or generate every possibility. Exemple :

?- element(X,[a,b,c],N).  
N = 1
X = a 

N = 2
X = b

N = 3
X = c

Thanks for the help.

Edit following gusbro answer :
I can't use already existing predicates, it's part of a course.
Reading your answer, I came up with this :

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 remove the element x from the list and returns the new list. But the backtracking is not working :

?- arguments(A,[1,2,3]). 
A = [1,2] ? 
yes

Upvotes: 1

Views: 132

Answers (1)

gusbro
gusbro

Reputation: 22585

You can use select/3 to select an element from a list (and get the remaining list), then do it again to select another element from the remaining list).

i.e.:

 arguments([A,B], L):-
   select(A, L, L1),
   select(B, L1,_).

Test case:

?- arguments(A,[1,2,3]).
A = [1, 2] ;
A = [1, 3] ;
A = [2, 1] ;
A = [2, 3] ;
A = [3, 1] ;
A = [3, 2]

Upvotes: 2

Related Questions