
:- op(1100,xfx,'-+->'). % neues Infix-Relationssymbol

ersetze_metaregeln :- tell('satzregeln2.pl'), 
    (A -+-> B),     % Instanz von (A -+-> B) beweisen
    portray_clause((A --> B)), % und als DCG-Regel 
    nl, fail.       % in 'satzregeln.pl' schreiben
ersetze_metaregeln :- told. % Datei schliessen.

(s([Def],[Temp,Vst,aktiv]) -+-> Konstituenten) :-
    ( Vst=ve, Def=qu
    ; Vst=vz, Def=def
    ; Vst=vl, Def=def % Def=rel (Relativsaetze, Nebens.)
    ),
%    member(Vst,[vz,vl]), % Auswahl für Teilgrammatik! 
%    member(Rahmen,[[nom,refl(akk)],[nom,daß]]),
    member(Rahmen,[[nom,akk],[nom,daß],
                   [nom,ob],[nom,refl(akk),ob],[nom,refl(akk)]]), 
    praedikatsteile(aktiv,Vst,
                    VFIN,VINF, % = Praedikatsteile
                    Rahmen,Pers,Num,Temp,Mod),
    expandiereSubjCat([Pers,Num],Rahmen,SubjRahmen),
    anordnung(SubjRahmen,SubjRahmenPerm),
    nachfeld(SubjRahmenPerm,SubjRahmenPerm2,Nachfeld),
    verbstellung(SubjRahmenPerm2,Vst,RahmenPraed), 
    append(RahmenPraed,Nachfeld,RahmenPraed2),
    expandiere([Pers,Num],RahmenPraed2,VFIN,VINF,Cats),
    listToTuple(Cats,Konstituenten).

(s([Def],[Temp,vl,aktiv]) -+-> [Conj], Konstituenten) :-
    ( (Def,Conj) = (daß,dass) ; (Def,Conj) = (ob,ob) ),
    (s([def],[Temp,vl,aktiv]) -+-> Konstituenten).

(kor(daß) -+-> [es]).
(pron([refl],[3,sg,akk]) -+-> [sich]).

% praedikatsteile/9:

praedikatsteile(aktiv,Vst,VFIN,[VINF],
                Rahmen,Pers,Num,Temp,ind) :-
    praedikatsteile(VFIN,VINF,
                    Vst,Rahmen,Pers,Num,Temp,aktiv),
    (Vst = ve ; Vst = vz ; Vst = vl).

% praedikatsteile/8: belegt VFIN,VINF

praedikatsteile(v([Rahmen],[Pers,Num,praes]),[],
                Vst,Rahmen,Pers,Num,praes,aktiv).
praedikatsteile([hat],v([Rahmen],[part2]),            
                Vst,Rahmen,3,sg,perf,aktiv).  
praedikatsteile([wird],v([Rahmen],[inf]),
                Vst,Rahmen,3,sg,fut1,aktiv).

% Expansion von Kategorienabkuerzungen:

expandiereSubjCat([Pers,Num],[Obj|Objs],[ObjE|Objs]) :-
    expandiereCat(Obj,ObjE),
    kongruenz_sfin(ObjE,[Pers,Num,nom]).
expandiereCat(nom,np([Pers,Gen,Num],[nom])) :- !.
expandiereCat(akk,np([Pers,Gen,Num],[akk])) :- !.
expandiereCat(daß,s([daß],_Form)) :- !.
expandiereCat(ob,s([ob],_Form)) :- !.
expandiereCat(X,X) :- !.  % (Vereinfachung) 

kongruenz_sfin(np([Pers,_Gen,Num],[Kas]),[Pers,Num,Kas]).
kongruenz_sfin(s([daß],[_Temp,vl,aktiv]),[3,sg,nom]).

anordnung([A,B],[A,B]).  anordnung([A,B],[B,A]).
anordnung([A,B,C],[A,B,C]).

% daß-Sätze ins Nachfeld, ergänze daß-Korrelat:
nachfeld([daß|ArgsPraed],[kor(daß)|ArgsPraed],[daß]).
nachfeld([daß|ArgsPraed],[ArgsPraed],[daß]).
nachfeld([daß|ArgsPraed],[kor(daß)|ArgsPraed],[]).
nachfeld([A|ArgsPraed],[A|ArgsPraed2],Nachfeld) :-
    nachfeld(ArgsPraed,ArgsPraed2,Nachfeld).
nachfeld([],[],[]).

% Besetzung der Satzklammern durch Verbteile:

verbstellung(Args,ve,ArgsPraed) :-
    append([vfin|Args],[vinf],ArgsPraed).
verbstellung([Arg|Args],vz,ArgsPraed) :-
    append([Arg,vfin|Args],[vinf],ArgsPraed).
verbstellung(Args,vl,ArgsPraed) :-
    append(Args,[vinf,vfin],ArgsPraed).

% Expandiere die Komplementabkuerzungen relativ zu den
% Finitheismerkmalen Fin und den Verbteilen Vfin,Vinf:

expandiere(Fin,[vfin|Args],Vfin,Vinf,[Vfin|Kats]) :-
    !, expandiere(Fin,Args,Vfin,Vinf,Kats).
expandiere(Fin,[vinf|Args],Vfin,Vinf,VinfKats) :-
    !, expandiere(Fin,Args,Vfin,Vinf,Kats),
    append(Vinf,Kats,VinfKats).
expandiere(Fin,[Arg|Args],Vfin,Vinf,[Kat|Kats]) :-
    !, expandiereCat(Fin,Arg,Kat), 
    expandiere(Fin,Args,Vfin,Vinf,Kats).
expandiere(Fin,[],Vfin,Vinf,[]).

% expandiereCat/3: Finitheitsmerkmale ins Reflexivpronomen
expandiereCat([Pers,Num], refl(akk),
    pron([refl],[Pers,Num,akk])) :- !.
expandiereCat([Pers,Num], X,C) :- expandiereCat(X,C).

listToTuple([Cat1,Cat2|Cats],(Cat1,Konstituenten)) :-
    listToTuple([Cat2|Cats],Konstituenten).
listToTuple([Cat],Cat).
listToTuple([],[]).
