%:- use_module(library(lists)).

app([],X,X).
app([H|X],Y,[H|XY]) :- app(X,Y,XY).


nrev([],[]).
nrev([H|T],R) :-
	nrev(T,TR),
	app(TR,[H],R).

rev2(L,R) :- rev3(L,[],R).
rev3([],Acc,Acc).
rev3([H|T],Acc,Res) :- rev3(T,[H|Acc],Res).

/* permute([a,b,c],X) , X == [a,b,c] */
/* permute([a,b,c],X) , X == [c,a,b] */

permute([],[]).
permute(T,[X|PermRest])  :-  del(T,X,Rest),
	permute(Rest,PermRest).

del([H|T],H,T).
del([H|T],X,[H|R]) :- del(T,X,R).


% TO DO: convert into DCG
pl(L) :- print_list(L),nl,fail.
print_list([]) :- print([]).
print_list([H|T]) :- print('.('),print(H),print(','), print_list(T), print(')').
print_list([H|T]) :- print('['),print(H),print('|'), print_list(T), print(']').
print_list([H|T]) :- print('['), print(H), print_list_aux(T),print(']').

print_list_aux([]).
print_list_aux([H|T]) :- print(','),print(H),
   (print_list_aux(T) ; print('|'), print_list(T)).
