:- module(dcg2mcfg,[]).

% Disjunktionen in der rechten Regelseite aufloesen:

translate1((L --> R),(L --> RT)) :-
   rhs(R,RT).

rhs((R,S),(RT,ST)) :-
    !, rhs(R,RT), rhs(S,ST).
rhs((R;S),T) :-
    !, (rhs(R,T);rhs(S,T)).
rhs(C,C).

% DCG-Regel mit Konj.von Konstituenten in MCFG-Regel übersetzen:
% Unklar: wie behandeln wir Regeln mit {Code}-Stücken? *)

translate2((L --> R),Rule) :-
    functor(L,Fun,_Arity),
    tuple2list(R,Rs),
    Term =.. [tr | Rs],
    list2args(Rs,1,Args),
    Rule = german:rule(Fun,L,Term,[p1=Args]).

tuple2list(A,[A]) :-
    var(A),!.
tuple2list((A,As),[A|Bs]) :-
    !,tuple2list(As,Bs).
tuple2list(A,[A]).

list2args([R|Rs],N,[arg(R,N,p1)|Args]) :-
    M is N+1,
    list2args(Rs,M,Args).
list2args([],_,[]).

% Kombination der Übersetzungen:

translate((L-->R), Rule) :-
    translate1((L-->R),(LT-->RT)),
    translate2((LT-->RT),Rule).

/* Man kann {Code}-Stücke vielleicht in der gesamten DCG
wegübersetzen, indem man mit kategorie/1 die Kategorien
ausinstantiiert und dann die {Code}-Teile bei der Übersetzung
auswertet.
*/

