:- ['DCGparser/parser.pl']. 

% Prädikate, die über mehrere Dateien definiert sind:
:- multifile n/5, cn/5, nv/5, a/5, art/5, pron/5,
    poss/5, num/5, det/5, np/5, s/5, v/5, ap/5,
    praeposition/2. % 5-stellig: cat(Art,Form,-Baum,+I,J)

% Analyse der Eingabe als:
startsymbol(np([_Pers,_Gen,_Num],[_Kas])).

genus(X):-   member(X,[mask,fem,neut,-]). % Merkmalwerte
numerus(X):- member(X,[sg,pl]).
kasus(X) :- member(X,[nom,gen,dat,akk]).
person(X):- member(X,[1,2,3]).
deklinationstyp(X):- member(X,[st,sw,ge]).

:- [lexikon_np].           % Lexikalische Regeln 

% Pseudodefinitionen mit ad-hoc Satzarten
s([rel],[ind]) --> [rels] .     % Relativsätze
s([def],[vz,konj]) --> [s].     % definite Sätze im Konj.
s([dass],[vl,ind]) --> [dass],[s]. % daß-Sätze 
s([qu],[vl,ind]) --> [s].       % Interrogativsätze
s([ob],[vl,ind]) --> [ob],[s].  % ob-Sätze
s([infzu],[]) --> [infzu].      % Verbalphrasen

np([Pers,Gen,Num],[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],[Dekl,Num,Kas]) -->  % Nomen+Komplement
    { Dekl = (-) },           % keine Adjektive vorhanden
    n([Kompl,Gen],[Num,Kas]), % ggf. Kompl = []
    ( [] ; np([3,_,_],[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],[KasP])
    ; { Kompl=[dass] },   
        ( s([dass],[vl,Mod]) % These, daß sie rund ist|sei
        ; s([def],[vz,konj]) % These, sie *ist|sei rund
        )
    ; { Kompl=[ob] },     % Untersuchung, ob sie lebt
        s([ob],[vl,ind])
    ; { Kompl=[qu] },     % Frage, wo Maria lebt
        s([qu],[vl,Mod])
    ; { Kompl=[infzu] },  % Absicht, zu rauchen
        s([infzu],[])
    ),
    ( []  % optionaler Relativsatz:   Menschen, 
    ; s([rel(Gen,Num)],[Mod]) ).    % an die wir denken

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

praeposition(in,akk).  praeposition(an,akk).
praeposition(auf,akk). praeposition(um,akk).
praeposition(mit,dat). praeposition(vor,dat).
praeposition(von,dat).

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
    ).
% Adjektivphrasen: ap([],[Komp,Dekl,Gen,Num,Kas])

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