:- 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.