38 lines
1.0 KiB
Plaintext
38 lines
1.0 KiB
Plaintext
:- 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).
|