% In mehreren Dateien (koordinationen.pl) definierte Prädikate,
% nach DCG-Übersetzung 5-stellig: cat(Art,Form,-Baum,+I,J):

:- multifile ap/5, np/5, s/5, n/5.

% Lexikalische Regeln: siehe syntax16-grammatik.pl, syntax16.wrd

np([Pers,Gen,Num,si],[Kas]) -->
    ( pron([],[Pers,Gen,Num,Kas])        % er, sie, es
%    ; pn([Gen],[Kas]), { Pers=3,Num=sg } % Hans, Maria
    ; n1([Gen],[Dekl,Num,Kas]),        % alte Menschen
        { Pers=3,(Num=pl;Num=sg),      % ohne Adj nicht 
          (Dekl=st ; (Dekl=(-), Kas\=gen)) } % im pl.gen
    ; det([Pers,Num,Dekl],[GenD,Kas]), % der alte Hund
        { GenD=(-) ; GenD=Gen },       % ein alter Hund
        n1([Gen],[Dekl1,Num,Kas]),     % ich alter Hund
        { Dekl1=(-) ; Dekl1=Dekl } % ggf. kein Adj in N1
    ).                   
% N mit Komplement und Attribut: n1([Gen],[Adekl,Num,Kas])

n1([Gen],[-,Num,Kas]) -->  % Nomen+Komplement
%    { Dekl = (-) },           % keine Adjektive vorhanden
    n([Kompl,Gen],[Num,Kas]), % ggf. Kompl = []
    ( [] ; np([3,_,_,si],[gen]) ), % opt. gen.poss/subj
    ( [] % Komplement optional: Hoffnung (auf NP)
    ; { Kompl=[gen] }, []     % gen-Objekt statt gen.subj
    ; { Kompl=[Praep,KasP],   % Angst vor den Hunden
        praeposition(Praep,KasP) },      
        [Praep], np([_Pers,_Gen,_Num,_Fig],[KasP])
    ; { Kompl=[daß] },   
        ( s([daß,_],[Temp,Mod, vl]) % These, daß sie rund ist|sei
        ; s([def,_],[Temp,konj,vz]) % These, sie *ist|sei rund
        )
    ; { Kompl=[ob] },     % Frage, (ob | wo) Maria lebt
        s([qu,_],[Temp,Mod,vl])
    ; { Kompl=[infzu] },  % Absicht, zu rauchen
        s([infzu,_],[Temp,-,-])
    ),
    ( []     % optionaler Relativsatz:   Menschen, 
    ; { GenR=Gen ; GenR=(-), Num=pl }, % an die wir denken
        s([rel(GenR,Num),_],[_,Mod,vl]) 
    ). 

n1([Gen],[Dekl,Num,Kas]) -->
    { Komp = pos }, % TODO: Komp=komp, sup
    ap([_Fig],[Komp,Dekl,GenD,Num,Kas]), % alte Hunde, die ...
    { GenD=(-) ; GenD=Gen },
    n1([Gen],[-,Num,Kas]).

det([Pers,Num,Dekl],[Gen,Kas])  -->
    ( ( art([Dekl,Num],[Gen,Kas])          % der, ein
      ; qnt([Dekl,Num],[Gen,Kas])          % kein, jeder
      ; poss([_,_,_],[Gen,Num,Kas]),{Dekl=ge} % mein,unser
      ), {Pers=3}
    ; pron([],[Pers,Gen,Num,Kas]),         % in manchen
        { (Pers=1 ; Pers=2)                % Formen:
        , (Kas=nom ; Kas=dat ; Kas=akk)
        , Dekl=st }                  % ich armer Student
    ).                          
% Zusammenfassung von Nomenarten: n([Kompl,Gen],[Num,Kas])

n([[],Gen],[Num,Kas]) -->
    ( pn([Gen],[Kas]), {Num=sg}  % Peter, Maria
    ; cn([Gen],[Num,Kas])        % Hund, Menschen
    ; mn([Gen],[Num,Kas])        % Wein(e), Wasser, Ruhe
    ).

n([Kompl,Gen],[Num,Kas]) -->
    ( na([Kompl,Gen],[Num,Kas])  % Gute, Neid auf
    ; nv([Kompl,Gen],[Num,Kas])  % Hoffnung auf
    ).

% einfache Adjektivphrasen: ap([si],[Komp,Dekl,Gen,Num,Kas])

ap([si],[pos,Dekl,Gen,Num,Kas]) -->
    ( [] % Komplemente stets optional
    ; { Kompl=[Pr,KasP], praeposition(Pr,KasP) },
        [Pr], np([_,_,_,si],[KasP])
    ; { Kompl=[Pr,KasP,KasAO], praeposition(Pr,KasP) },
        [Pr], np([_,_,_,si],[KasP]), 
        (np([_,_,_,si],[KasAO]) ; []) 
        % Linksrekursion durch Stellung vermieden!
    ),
    ( [] ; [sehr] ), 
    a([Kompl],[Dekl,Gen,Num,Kas]).     % NP-Regeln der folgenden Folien


% Adverbialphrasen: advp([Art],[]) (mit einf+koord.Sätzen)

advp([Art],[]) -->
    ( ([] ; ([sehr], { Art=dur })),
        adv([Art],[])
    ; prep([Art,Kas],[]),
        np([_,_,_,_],[Kas])
    ; subj([Art],[]),        % in metaregelnAdv.pl erzeugt 
        s([def,si],[_,ind,vl])  % ohne s.def.vl-Kategorie
    ).
advp([kond],[]) -->
    s([def,si],[praes,ind,ve]). % , ( [] ; [dann] ).


