:- module permutations2. :- interface. :- import_module io. :- pred main(io::di, io::uo) is det. :- import_module list. :- import_module set_ordlist. :- import_module set. :- import_module solutions. %% permutationSet(List, Set) is true if List is a permutation of Set: :- pred permutationSet(list(A)::out,set(A)::in) is nondet. %% Two ways to compute all permutations of a given list (using backtracking): :- func all_permutations1(list(int))=set_ordlist.set_ordlist(list(int)). :- func all_permutations2(list(int))=set_ordlist.set_ordlist(list(int)). :- implementation. permutationSet([],set.init). permutationSet([H|T], S) :- set.member(H,S), permutationSet(T,set.delete(S,H)). all_permutations1(L) = solutions_set(pred(X::out) is nondet:-permutationSet(X,set.from_list(L))). %%Alternatively, using the imported list.perm predicate: all_permutations2(L) = solutions_set(pred(X::out) is nondet:-perm(L,X)). main(!IO) :- print(all_permutations1([1,2,3,4]),!IO), nl(!IO), print(all_permutations2([1,2,3,4]),!IO).