Hi, I don't know how much of a hack this is, but I put together this small module to override the way that lists and terms are printed. It seems to do what Anne is after. Not sure.
~~~
$ cat
pedagogical.pl :- module(pedagogical, []).
:- multifile user:portray/1.
user:portray(L) :- is_list(L),
L = [H|T],
format("'[|]'(~p,~p)", [H,T]).
user:portray(C) :- compound(C),
compound_name_arguments(C, Name, [A|Args]),
format("~p(~p", [Name, A]),
forall(member(X, Args), format(",~p", [X])),
format(")").
~~~
To use it, just use use_module:
~~~
$ swipl -q
?- use_module(pedagogical).
true.
?- numlist(1, 3, L).
L = '[|]'(1,'[|]'(2,'[|]'(3,[]))).
?- length(L, 3).
L = '[|]'(_2752,'[|]'(_2758,'[|]'(_2764,[]))).
?- X = a + b / [foo,bar,baz].
X = +(a,/(b,'[|]'(foo,'[|]'(bar,'[|]'(baz,[]))))).
?- [a+b,a-b,x^2,-3] = X.
X = '[|]'(+(a,b),'[|]'(-(a,b),'[|]'(^(x,2),'[|]'(-3,[])))).
~~~