label(T,LT) :- label([],T,LT). label(P,T,LT) :- T =.. [F|Args], labelAll(P,0,Args,LArgs), LT =.. [F,P|LArgs]. labelAll(_,_,[],[]). labelAll(P,N,[X|Xs],[Y|Ys]) :- append(P,[N],PN), label(PN,X,Y), N1 is N+1, labelAll(P,N1,Xs,Ys). append([],Ys,Ys). append([X|Xs],Ys,[X|Zs]) :- append(Xs,Ys,Zs). % | ?- label(f(a,g(b),h(a,b)),LT). % LT = f([],a([0]),g([1],b([1,0])),h([2],a([2,0]),b([2,1]))) ? ;