
paren([Arg|Args]) :- !, write('['), args([Arg|Args]), write(']').
paren(E) :- E =.. [Op], !, write(Op) .
paren(E) :- E =.. [Op|Args], write(Op), write('('), args(Args), write(')').

args([Arg]) :- paren(Arg), !.
args([Arg|Args]) :- paren(Arg), write(','), args(Args).

% ---

parse(E) :- listify(E,L), pp(0,L) .

pp(Indent,[X|R]) :- !, indent(Indent), write(X), nl,
	N is Indent+1, ppl(N,R) .

% pp(Indent,[X]) :- !, indent(Indent), write(X), nl.
pp(Indent,X) :- indent(Indent), write(X), nl.

ppl(Indent,[X|L]) :- pp(Indent,X), ppl(Indent,L).
ppl(Indent,[]).

indent(0).
indent(N) :- N>0, write(' '), M is N-1, ibar(M).
ibar(0).
ibar(N) :- N>0, write('|'), M is N-1, indent(M).

listify([E|Elist],[P|Plist]) :- !, listify(E,P), listify(Elist,Plist).
listify([],[]) :- !.
listify(X,X) :- atom(X), !.
listify(X,X) :- number(X), !.
listify(E,[Op|L]) :- E =.. [Op|Args], !, listify(Args,L) .
listify(X,X).

