:- module(addTree,[]).

% translate(+DCG-Regel, -DCG-Regel mit Baumausgaben)
translate((L --> R),(Ltr --> Rtr)) :-
   !, translate(L,Ltr,[Baum]),  
   translate(R,Rtr,Baumliste),
   Baum = [L|Baumliste].
translate(Term,Term). % nur Regeln ändern

% translate(+Rechts,-RechtsTr,-Baumliste)
translate((A;B),(Atr;Btr),Baeume) :- % Baeume ist Var!
    !, translate(A,Atr0,BaeumeA),
       translate(B,Btr0,BaeumeB),
    Atr = (Atr0,{ Baeume=BaeumeA }),
    Btr = (Btr0,{ Baeume=BaeumeB }).

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],[[Atom]|Baeume]) :-
    !, translate(As,As,Baeume).
translate({Prolog},{Prolog},[]) :- !.
translate(Kategorie,Term,[Baum]) :-
    Kategorie =.. [Funktor|Argumente],
    append(Argumente,[Baum],MehrArgumente),
    Term =.. [Funktor|MehrArgumente].

