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

s([qu],[Temp,Mod,ve]) -->
    v([sein],[3,Num,Temp,Mod]),
    np([Def1,3,_Gen1],[Num,nom]),
    { Def1 = def ; Def1 = indef ; Def1 = quant },
    np([Def2,3,_Gen2],[Num,nom]), % ,['?'],
    { Def2 = indef ; Def2 = def }. 

s([rel(Gen,Num)],[Temp,Mod,vl]) -->
    np([rel(Gen,Num),3,_Gen1],[Num2,nom]),
    np([Def2,3,_Gen2],[Num2,nom]),
    { member(Def2,[def,indef]) }, % quant?
    v([sein],[3,Num2,Temp,Mod]).
    
s([Def1],[Temp,Mod,vz]) -->
    np([Def1,3,_Gen1],[Num,nom]),
    { member(Def1,[def,indef,quant,qu]) },
    v([sein],[3,Num,Temp,Mod]),
    ap([def],[komp]).

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

s([Def1],[Temp,Mod,vl]) -->
    np([Def1,3,_Gen1],[Num,nom]),
    { member(Def1,[def,indef,quant,qu,rel(_,_)]) },
    ap([def],[komp]),
    v([sein],[3,Num,Temp,Mod]).

ap([def],[komp]) -->  
    a([als(nom)],[komp]), [als],
    np([Def2,3,_Gen2],[_Num,nom]),
    { Def2 = indef ; Def2 = def ; Def2 = quant}.

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

s([qu],[Temp,Mod,ve]) -->
    v([nom,akk],[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]),
    { ( [Num,nom,akk] = [Num1,Kas1,Kas2]
      ; [Num,nom,akk] = [Num2,Kas2,Kas1] )
    }.

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]) },
    v([nom,akk],[3,Num,Temp,Mod]),
    { ( [Num,nom,akk] = [Num1,Kas1,Kas2]
      ; [Num,nom,akk] = [Num2,Kas2,Kas1] )
    }.

s([qu],[Temp,Mod,ve]) -->
    v([werden],[3,Num,Temp,Mod]),
    np([_Def,3,_Gen],[Num,nom]),
    ([] ; [von], np([_Def2,_Pers2,_Gen2],[_Num2,dat])),
    v([nom,akk],[part2]).

s([Def],[Temp,Mod,vz]) -->
    np([Def,3,_Gen],[Num,nom]),
    v([werden],[3,Num,Temp,Mod]), 
    ([] ; [von], np([_Def2,_Pers2,_Gen2],[_Num2,dat])),
    v([nom,akk],[part2]).

s([Def],[Temp,Mod,vl]) -->
    np([Def,3,_Gen],[Num,nom]), 
    { Def = rel(_GenR,_NumR) },
    ([] ; [von], np([_Def2,_Pers2,_Gen2],[_Num2,dat])),
    v([nom,akk],[part2]),
    v([werden],[3,Num,Temp,Mod]).
s([rel(Gen,Num)],[Temp,Mod,vl]) -->
    np([rel(Gen,Num),3,_Gen1],[Num2,nom]),
    np([Def2,3,Gen2],[Num2,nom])/s([rel(Gen2,Num2)],
                                   [Temp2,Mod2,vl]),
    { member(Def2,[def,indef]) }, 
    v([sein],[3,Num2,Temp,Mod]),
    s([rel(Gen2,Num2)],[Temp2,Mod2,vl]).

s([rel(GenR,NumR)],[Temp,Mod,vl]) -->
    np([rel(GenR,NumR),3,_Gen1],[Num1,Kas1]),  
    np([Def2,3,_Gen2],[Num2,Kas2])/s([rel(Gen2,Num2)],
                                   [Temp2,Mod2,vl]),
    { member(Def2,[def,indef,quant]) },
    v([nom,akk],[3,Num,Temp,Mod]),
    { ( [Num,nom,akk] = [Num1,Kas1,Kas2]
      ; [Num,nom,akk] = [Num2,Kas2,Kas1] )
    },
    s([rel(Gen2,Num2)],[Temp2,Mod2,vl]).

np([Def,3,Gen],[Num,Kas])/s([rel(Gen,Num)],
                            [Temp,Mod,vl]) -->
    det([Def],[Gen,Num,Kas]),
    n([Gen],[Num,Kas]),
    s([rel(Gen,Num)],[Temp,Mod,vl])/s([rel(Gen,Num)],
                                      [Temp,Mod,vl]).
s([rel(Gen,Num)],
  [Temp,Mod,vl])/s([rel(Gen,Num)],
                   [Temp,Mod,vl]) --> [].

s([Def],[Temp,Mod,vz]) -->
    np([Def1,3,_Gen1],[Num,nom]),
    { member(Def1,[def,indef,quant]), Def = def
    ; Def1 = qu, Def = qu },    
    v([sein],[3,Num,Temp,Mod]),
    ap([Def2],[Komp]), { (Komp = pos ; Komp = sup)
                       , (Def2 = def ; Def2 = indef) }.

s([qu],[Temp,Mod,ve]) -->
    v([sein],[3,Num,Temp,Mod]),
    np([Def1,3,_Gen1],[Num,nom]),
    { member(Def1,[def,indef,quant]) },
    ap([Def2],[Komp]), { (Komp = pos ; Komp = sup)
                       , (Def2 = def ; Def2 = indef) }.

s([rel(Gen,Num)],[Temp,Mod,vl]) -->
    np([rel(Gen,Num),3,_Gen1],[Num1,nom]),
    ap([def],[pos]),
    v([sein],[3,Num1,Temp,Mod]).
s([def],[Temp,Mod,vl]) -->
    np([Def,3,_Gen1],[Num1,nom]),
    { Def = def; Def = indef; Def = quant },
    ap([Def2],[Komp]), { (Komp = pos ; Komp = sup)
                       , (Def2 = def ; Def2 = indef) },
    v([sein],[3,Num1,Temp,Mod]).

s([qu],[Temp,Mod,vz]) -->
    ap([qu],[Komp]),
    { Komp = pos ; Komp = komp },
    v([sein],[3,Num,Temp,Mod]),
    np([Def1,3,_Gen1],[Num,nom]),
    { member(Def1,[def,indef,quant]) }.

