:- ensure_loaded( 'System/Swi/std' ).

permutation( [], [] ).
permutation( List, [H|T] ) :-
	select( H, List, Rem ),
	permutation( Rem, T ).

% swap( [(Fn,F),(Sn,S)|T], [(Sn,S),(Fn,F)|T] ) :- 
	% Fn < Sn.
% swap( [H|T], [H|Swap]  ) :-
	% swap( T, Swap ).
% swap( [F,S|T], [J,S|Ump] ) :-
	% swap( [F|T], [J|Ump] ).

swzip( [], _Nth, [] ).
swzip( [H|T], Nth, [(Nth,H)|Swz] ) :-
	NxN is Nth + 1,
	swzip( T, NxN, Swz ).

swap( [H|T], [X|Swap] ) :-
	xcange( T, H, X, Swap ).
swap( [H|T], [H|Sw] ) :-
	swap( T, Sw ).

xcange( [Out|T], In, Out, [In|T] ) :-
	can_swap( In, Out ).
xcange( [H|T], In, Out, [H|XchT] ) :-
	xcange( T, In, Out, XchT ).

can_swap( (FrmN,_FrmObj), (ToN,_ToObj) ) :-
	FrmN < ToN.

test_swap :-
	swzip( "abcdefghijklmnopqrstuvwxyz", 1, SWZiped ),
	findall( X, swap(SWZiped,X), Xs ),
	length( Xs, Length ),
	write( length(Length) ), nl.

