:- ['DCGparser/parser.pl'].                % Autor: Hans Leiss, LMU, CIS, 2010/14
:- [lexikon_np].                           % angepasst und um np2,np3,np4 erweitert.

:- 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.

startsymbol(np([_Pers,_Gen,_Num],[_Kas])).
startsymbol(det([_Pers,_Num,_Dekl],[_Gen,_Kas])). % Zum Testen
startsymbol(n1([_Gen],[_Dekl,_Num,_Kas])).
startsymbol(ap([],[pos,_Dekl,_Gen,_Num,_Kas])).
% startsymbol(s([Temp,Vst,Diath])).
startsymbol(s([_Def],[_Temp,_Vst,_Diath])).

% Art- und Formmerkmale und ihre Werte:

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

% Kategorien:

kategorie(np([P,G,N],[K])) :-
    person(P), genus(G), numerus(N), kasus(K),
    ( G=(-), (P=1 ; P=2 ; (P=3, N=pl))
    ; G\=(-), P=3, N=sg ).

% Grammatikregeln:

np([Pers,Gen,Num],[Kas]) -->
    ( pron([],[Pers,Gen,Num,Kas]) % Personalpronomen: er, sie, es
    ; pn([Gen],[Kas]), {Pers=3,Num=sg} % Eigennamen: Hans, Peter
    ; n1([Gen],[Dekl,Num,Kas]),  % erweiterte Nomina ohne Determinator
        {Pers=3,Num=pl,Dekl=st}                               
    ; det([Pers,Num,Dekl],[GenD,Kas]),
        { GenD=(-) ; GenD=Gen }, % der alte Mann, der ...,			
        n1([Gen],[Dekl,Num,Kas])
    ).                       

% N mit Komplement und Attribut: n1([Gen],[Adekl,Num,Kas])

n1([Gen],[Dekl,Num,Kas]) -->
    { deklinationstyp(Dekl) },
    n([Kompl,Gen],[Num,Kas]),
    ( np([3,_,_],[gen]), { not([Num,Kas]=[pl,gen]) }
    ; [] % Genetivus possessivus/subjectivus, optional
    ),
    ( [] % Komplemente sind optional
%    ; { Kompl=[] }, []
    ; { Kompl=[gen] },
        [] % gen-Objekt statt Gen.subjectivus
    ; { Kompl=[Praep], praeposition(Praep,KasP) },      
        [Praep],
        np([_Pers,_Gen,_Num],[KasP])
    ; { Kompl=[dass] },
        ( ([daß] ; [dass]), s([daß],[Temp,vl,Diath])
        ; s([],[vz,konj])
        )
    ; { Kompl=[ob] },
        [ob], s([ob],[vl,ind])
    ; { Kompl=[infzu] },
        s([infzu],[])
    ; s([rel(Gen,Num)],[Temp,_VSt,Diath])
    ).

% sehr grosse Angst vor dem Untergang
n1([Gen],[Dekl,Num,Kas])	-->
    ap([],[Komp,Dekl,GenD,Num,Kas]),
    { GenD=(-) ; GenD=Gen },
    { Komp = pos }, % TODO
    n1([Gen],[Dekl,Num,Kas]).

% Dekl als Artunterscheidung in art,qnt unabhaengig von der Definitheit,
% damit man es bei Quantoren einfach aendern kann. 
%
% regiert(Def,Dekl) :-
%    ((Def=def, Dekl=sw);(Def=indef, Dekl=ge)).

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, dein
% linksrekursiv: ; np([3,_Gen,_Num],[gen]),{Dekl=ge}  % des Bäckers
      ),                          
        {Pers=3}
    ; pron([],[Pers,Gen,Num,Kas]),
        { (Pers=1 ; Pers=2)
        , (Kas=nom ; Kas=dat ; Kas=akk)
        , Dekl=st }   % ich armer Student
    ).                          

% Zusammenfassung von Nomenarten zu n([Kompl,Gen],[Num,Kas])

% Eigennamen: Hans, Peter
n([[],Gen],[Num,Kas]) -->
    pn([Gen],[Kas]),{Num=sg}. 

% Count Nouns: Flaschen, Pferde
n([[],Gen],[Num,Kas])	-->
    cn([Gen],[Num,Kas]).

% Mass Nouns: Käse, Wasser
n([[],Gen],[Num,Kas])	-->
    mn([Gen],[Kas]), {Num=sg}.

% Nominalisierte Adjektive: Eitelkeit(en), Schönheit, Gute
n([Kompl,Gen],[Num,Kas])	-->
    na([Kompl,Gen],[Num,Kas]). 
	
% Nominalisierte Verben: Versuch (zu), Hoffnung (auf), Ermordung (des)
n([Kompl,Gen],[Num,Kas]) -->
    nv([Kompl,Gen],[Num,Kas]).
					
% Mit Praeposition ans Verb/Nomen angeschlossene Argumente:

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

% Praepositionalphrasen (nur als Adverbiale): pp([Kas],[Praep]).

pp([],[Praep]) -->
    { praeposition(Praep,Kas) },
    [Praep], 
    np([_Pers,_Gen,_Num],[Kas]).

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

ap([],[pos,Dekl,Gen,Num,Kas]) -->
    ( []
    ; { Kompl=[Pr], praeposition(Pr,KasP) },
        [Pr], np([Pers,Gen2,Num2],[KasP])
    ; { Kompl=[Pr,KasAO], praeposition(Pr,KasP) },
        [Pr], np([Pers,Gen2,Num2],[KasP]),
        np([_PersAO,_GenAO,_NumAO],[KasAO]) % Linksrek.vemeiden!
    ),
    a([Kompl],[Dekl,Gen,Num,Kas]).

% Undefinierte Kategorien (Pseudodefinitionen)

s([rel],[]) --> [s_rel].
s([infzu],[]) --> [infzu].
s([],[vl]) --> [s].
s([],[vz,konj]) --> [s].   
s([ob],[vl,ind]) --> [s].  % 

% Erweiterung um erzeugte Satzregeln: (spaeter)
:- [satzregeln].
:- [lexikon_v].

% Zusatzlexikon fuer Aufgabe 5.1 und Aufgabe 6.2 (2014)
:- [lexikon_np2].

% Zusatzregeln fuer Aufgabe 6.2 2014
% NPs mit Interrogativ- und Demonstrativpronomen
:- [np2].  % interrogatives Possessivpronomen
% :- [lexikon_np2]. s.o.

% Zusatzregeln und -lexikon fuer Numerale und Possessiv,
% Aufgabe 7.2, 2014
:- [np3], [lexikon_np3].

:- [np4]. % Relativsatzregel und Relativpronomen

