:- module(addTree,[]).

translate((L --> R),(Ltr --> Rtr)) :-
   !, translate1(L,Ltr,Baum),
   translate2(R,Rtr,Baumliste),  
   Baum = [L|Baumliste].
translate(Term,Term). % nur Regeln ändern

% translate1(+Kategorie,-Term,?Baum)
translate1(Kategorie,Term,Baum) :-
    Kategorie =.. [Funktor|Argumente],
    append(Argumente,[Baum],MehrArgumente),
    Term =.. [Funktor|MehrArgumente].

% translate2(+Rechts,-RechtsTr,-Baumliste)
translate2((A;B),(Atr;Btr),Baeume) :- % Baeume ist Var!
    !, translate2(A,Atr0,BaeumeA),
       translate2(B,Btr0,BaeumeB),
    Atr = (Atr0,{ Baeume=BaeumeA }),
    Btr = (Btr0,{ Baeume=BaeumeB }).
translate2((A,B),Tr,Baeume) :-
    !, translate2(A,Atr,BaeumeA),
       translate2(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)})
    ).
translate2([],[],[]) :- !.
translate2([Atom|As],[Atom|As],[[Atom]|Baeume]) :-
    !, translate2(As,As,Baeume).
translate2({Prolog},{Prolog},[]) :- !.
translate2(Cat,CatTr,[Baum]) :-
    !, translate1(Cat,CatTr,Baum).

fixed_length(L) :-
    var(L),!, fail. % L nicht belegen!
fixed_length([]).
fixed_length([_X|Xs]) :-
    fixed_length(Xs).

