:- module(addDepth,[]).

% translate(+DCG-Regel, -DCG-Regel mit Baumtiefenausgaben)
translate((L --> R),(Ltr --> Rtr, Bedingung)) :-
   !, translate(L,Ltr,[Baumtiefe]),  
   translate(R,Rtr,Baumtiefeliste),
%   Baumtiefe = [L|Baumtiefeliste].
   Bedingung = { max_list(Baumtiefeliste,Maximum),
                 Baumtiefe is 1 + Maximum }.

translate(Term,Term). % nur Regeln ändern

% translate(+Rechts,-RechtsTr,-Baumtiefeliste)
translate((A;B),(Atr;Btr),Baumtiefen) :- % Baumtiefen ist Var!
    !, translate(A,Atr0,BaumtiefenA),
       translate(B,Btr0,BaumtiefenB),
    Atr = (Atr0,{ Baumtiefen=BaumtiefenA }),
    Btr = (Btr0,{ Baumtiefen=BaumtiefenB }).

translate((A,B),Tr,Baeume) :-
    !, translate(A,Atr,BaeumeA),
       translate(B,Btr,BaeumeB),
    (fixed_length(BaeumeA) % s.u.
    -> Tr = (Atr,Btr), % jetzt verketten:
        append(BaeumeA,BaeumeB,Baeume) 
    ;  Tr = (Atr,Btr,  % erst beim Parsen verketten:
               {append(BaeumeA,BaeumeB,Baeume)})
    ).
fixed_length(L) :-
    var(L),!, fail. % L nicht belegen!
fixed_length([]).
fixed_length([_X|Xs]) :-
    fixed_length(Xs).

translate([],[],[]) :- !.
translate([Atom|As],[Atom|As],[0|Baumtiefen]) :-
    !, translate(As,As,Baumtiefen).
translate({Prolog},{Prolog},[]) :- !.
translate(Kategorie,Term,[Baumtiefe]) :-
    Kategorie =.. [Funktor|Argumente],
    append(Argumente,[Baumtiefe],MehrArgumente),
    Term =.. [Funktor|MehrArgumente].

