visit(Pred,N,Term) :-
    Term =.. [Functor|Args],
    length(Args,Arity),
    say(N, Functor/Arity),
    once(maplist(visit0(Pred,N+4),Args)).

visit0(Pred,N,X) :- var(X),    call(Pred,N,X).
visit0(Pred,N,X) :- atomic(X), call(Pred,N,X).
visit0(Pred,N,X) :- visit(Pred,N+4,X).

say(N,X) :- tab(N),print(X),nl. 

demos(visit) :- 
    forall(demo1(X),demo2(X)).


