% Regeln für einfache Sätze mit intransitivem Vollverb:

s([Def],[Temp,Mod,vz]) -->
    np([Def1,3,_Gen1],[Num1,Kas1]),
    { member(Def1,[def,indef,quant,qu]),
      (Def1 = qu -> Def = qu ; Def = def) },
    v([nom],[3,Num,Temp,Mod]),
    { [Num,nom] = [Num1,Kas1] }.

s([qu],[Temp,Mod,ve]) -->
    v([nom],[3,Num,Temp,Mod]),
    { member(Def1,[def,indef,quant]) },
    np([Def1,3,_Gen1],[Num1,Kas1]),
    { [Num,nom] = [Num1,Kas1] }.

s([rel(GenR,NumR)],[Temp,Mod,vl]) -->
    np([rel(GenR,NumR),3,_Gen1],[Num1,Kas1]),
    v([nom],[3,Num,Temp,Mod]),
    { [Num,nom] = [Num1,Kas1] }.

% Regeln für einfache Sätze mit bitransitivem Vollverb:

s([Def],[Temp,Mod,vz]) -->
    np([Def1,3,_Gen1],[Num1,Kas1]),
    { member(Def1,[def,indef,quant,qu]),
      (Def1 = qu -> Def = qu ; Def = def) },
    v([nom,Obj2,Obj3],[3,Num,Temp,Mod]),
    np([Def2,3,_Gen2],[Num2,Kas2]),
    { member(Def2,[def,indef,quant]) }, % kein qu!
    np([Def3,3,_Gen3],[Num3,Kas3]),
    { member(Def3,[def,indef,quant]) }, % kein qu!
    { bitrKongruenz([Num,nom,Obj2,Obj3],[Num1,Kas1,Num2,Kas2,Num3,Kas3]) }.

s([qu],[Temp,Mod,ve]) -->
    v([nom,Obj2,Obj3],[3,Num,Temp,Mod]),
    { member(Def1,[def,indef,quant]) },
    np([Def1,3,_Gen1],[Num1,Kas1]),
    { member(Def2,[def,indef,quant]) },
    np([Def2,3,_Gen2],[Num2,Kas2]),
    { member(Def3,[def,indef,quant]) }, % kein qu!
    np([Def3,3,_Gen3],[Num3,Kas3]),
    { bitrKongruenz([Num,nom,Obj2,Obj3],[Num1,Kas1,Num2,Kas2,Num3,Kas3]) }.

s([rel(GenR,NumR)],[Temp,Mod,vl]) -->
    np([rel(GenR,NumR),3,_Gen1],[Num1,Kas1]),
    np([Def2,3,_Gen2],[Num2,Kas2]),
    { member(Def2,[def,indef,quant]) },
    np([Def3,3,_Gen3],[Num3,Kas3]),
    { member(Def3,[def,indef,quant]) }, % kein qu!
    v([nom,Obj2,Obj3],[3,Num,Temp,Mod]),
    { bitrKongruenz([Num,nom,Obj2,Obj3],[Num1,Kas1,Num2,Kas2,Num3,Kas3]) }.

bitrKongruenz([Num,nom,Obj2,Obj3],[Num1,Kas1,Num2,Kas2,Num3,Kas3]) :-
    ( [Num,nom,Obj2,Obj3] = [Num1,Kas1,Kas2,Kas3]
    ; (Obj2 \= Obj3, [Num,nom,Obj2,Obj3] = [Num1,Kas1,Kas3,Kas2])
    ; [Num,nom,Obj2,Obj3] = [Num2,Kas2,Kas1,Kas3]
    ; (Obj2 \= Obj3, [Num,nom,Obj2,Obj3] = [Num2,Kas2,Kas3,Kas1])
    ; (Obj2 \= Obj3, [Num,nom,Obj2,Obj3] = [Num3,Kas3,Kas1,Kas2])
    ; (Obj2 \= Obj3, [Num,nom,Obj2,Obj3] = [Num3,Kas3,Kas2,Kas1])
    ).

wort(nennen,v([nom,akk,akk],[3,sg,praes,ind]),nennt).
wort(nennen,v([nom,akk,akk],[3,sg,praet,ind]),nannte).
wort(nennen,v([nom,akk,akk],[3,pl,praes,ind]),nennen).
wort(nennen,v([nom,akk,akk],[3,pl,praet,ind]),nannten).

wort(zeigen,v([nom,dat,akk],[3,sg,praes,ind]),zeigt).
wort(zeigen,v([nom,dat,akk],[3,sg,praet,ind]),zeigte).
wort(zeigen,v([nom,dat,akk],[3,pl,praes,ind]),zeigen).
wort(zeigen,v([nom,dat,akk],[3,pl,praet,ind]),zeigten).

