:- perm(i,o).

% mode: perm[i,o]
perm([],[]).
perm(L,[H|T]) :- append2(V,[H|U],L),
                 append1(V,U,W),
                 perm(W,T).

% mode: append1[i,i,o]
append1([],L,L).
append1([H|L1],L2,[H|L3]) :- append1(L1,L2,L3).

% mode: append2[o,o,i]
append2([],L,L).
append2([H|L1],L2,[H|L3]) :- append2(L1,L2,L3).
