% :- module(flexion_slex,[erzeuge_vollformenlexikon/1]).
:- use_module([wortformen]). 

flektiere(Stammform,Vollform) :-
    lex(Stammform,Wortart,_,Flexionsklasse),
    form(Wortart,Formmerkmale),
    beuge(Wortart,Flexionsklasse,Stammform,
          Formmerkmale,Vollform).

beuge(v,Flexionsklasse,Stammform,Form,Vollform) :-
    konjugiere(Flexionsklasse,Stammform,Form,Vollform).
beuge(Wortart,Flexionsklasse,Stammform,Form,Vollform) :-
    (Wortart = n ; Wortart = rn ; Wortart = en),
    dekliniere(Flexionsklasse,Stammform,Form,Vollform).

flexion(Stammform) :-
    ( lex(Stammform,v,_,Flexionsklasse)        % Verbstamm?
    ->  verbflexion(Flexionsklasse,Stammform)
    ; lex(Stammform,Wortart,_,Flexionsklasse), % Nomenstamm?
        member(Wortart,[n,rn,en])
    ->  nomenflexion(Flexionsklasse,Stammform) 
    ; nl, 
        write('Das Stammlexikon hat keinen Eintrag zu: '),
        write(Stammform)
    ).
        
% verbflexion(+Konjugationsklasse,+Stammform)
verbflexion(Konjugationsklasse,Stammform) :-
    form(vfin,Formmerkmale),
    konjugiere(Konjugationsklasse,Stammform,
               Formmerkmale,Vollform),
    write(Formmerkmale),write(': '),write(Vollform),nl,
    fail.              % weitere Formmerkmale suchen
verbflexion(_,_).      % fertig.
% konjugiere(+Konjugationsklasse,+Infinitiv,
%            ?[Pers,Num,Temp,Mod],-Vollform)

% --- Regelmaessige Konjugation (Finite Formen) ---

konjugiere(rg(_),Infinitiv,[Pers,Num,Temp,Mod],Vollf) :-  
    concat(Stamm,'en',Infinitiv),
    endung(rg, [Pers,Num,Temp,Mod],Endung),
    (dentalstamm(Stamm), \+ concat(e,_,Endung)
    -> concat(e,Endung,ErwEndung) 
    ;  ErwEndung = Endung
    ),
    concat(Stamm,ErwEndung,Vollf).

dentalstamm(Stamm) :- 
    concat(_,'d',Stamm) ; concat(_,'t',Stamm).

% -- regelmaessige Konjugation --

endung(rg,[1,sg,praes,ind], 'e').
endung(rg,[1,sg,praes,konj],'e').
endung(rg,[1,sg,praet,ind], 'te').
endung(rg,[1,sg,praet,konj],'te').

endung(rg,[1,pl,praes,ind], 'en').
endung(rg,[1,pl,praes,konj],'en').
endung(rg,[1,pl,praet,ind], 'ten').
endung(rg,[1,pl,praet,konj],'ten').

endung(rg,[2,sg,praes,ind], 'st').
endung(rg,[2,sg,praes,konj],'est').
endung(rg,[2,sg,praet,ind], 'test').
endung(rg,[2,sg,praet,konj],'test').

endung(rg,[2,pl,praes,ind], 't').
endung(rg,[2,pl,praes,konj],'et').
endung(rg,[2,pl,praet,ind], 'tet').
endung(rg,[2,pl,praet,konj],'tet').

endung(rg,[3,sg,praes,ind], 't').
endung(rg,[3,sg,praes,konj],'e').
endung(rg,[3,sg,praet,ind], 'te').
endung(rg,[3,sg,praet,konj],'te').

endung(rg,[3,pl,praes,ind], 'en').
endung(rg,[3,pl,praes,konj],'en').
endung(rg,[3,pl,praet,ind], 'ten').
endung(rg,[3,pl,praet,konj],'ten').

