Permutations: Difference between revisions
Content added Content deleted
(Mercury!) |
|||
Line 3,854: | Line 3,854: | ||
(%i1) permutations([1, 2, 3]); |
(%i1) permutations([1, 2, 3]); |
||
(%o1) {[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]} |
(%o1) {[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]} |
||
</lang> |
|||
=={{header|Mercury}}== |
|||
<lang mercury> |
|||
:- 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. |
|||
%% permutations(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))). |
|||
all_permutations2(L) = |
|||
solutions_set(pred(X::out) is nondet:-perm(L,X)). |
|||
main(!IO) :- |
|||
print(all_permutations1([1,2,3,4,5]),!IO), |
|||
nl(!IO), |
|||
print(all_permutations2([1,2,3,4,5]),!IO). |
|||
</lang> |
</lang> |
||