:- ['DCGparser/parser.pl'].                % Autor: Hans Leiss, LMU, CIS, 2010
:- [lexikon_np].

:- multifile n/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]).
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])
    ; [] % 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,_])
    ; { Kompl=[infzu] },
        s([infzu],[])
    ; s([rel],[])
    ).

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

% Dekl als Artunterscheidung in art,qu 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].

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