%Satzregel %das Verb liefert den Verbrahmen in allen Permutationen %der Verbrahmen kommt vom finiten Verbteil (der Astronom entdeckt den Planeten) %oder vom infiniten Verbteil (der Astronom hat den Planeten entdeckt). satz --> np(MNP1,MoeglicheRelS1), vfin([np(MNP1),np(MNP2)],MerkmaleFinV), np(MNP2,MoeglicheRelS2), vinf([np(MNP1),np(MNP2)],MerkmaleFinV), {append(MoeglicheRelS1,MoeglicheRelS2,MoeglicheRelS)}, optrel(MoeglicheRelS). satz --> np([nom,Num|_],MoeglicheRelS), kopulaverb(Num), praedikativ(Num), optrel(MoeglicheRelS). optrel(_) --> []. optrel(RelsatzMerkmale) --> {member(Merkmale,RelsatzMerkmale)}, relsatz(Merkmale). relsatz([_,Num,Gen|_]) --> relpron([Kasus,Num,Gen|R]), np(MNP,[_]), vinf([np([Kasus,Num,Gen|R]),np(MNP)],MerkmaleFinV), vfin([np([Kasus,Num,Gen|R]),np(MNP)],MerkmaleFinV). praedikativ(_) --> adj(unfl). praedikativ(Num) --> np([nom,Num|_]). np(Mm,[Mm]) --> art(Mm), ap(Mm,0), n(Mm). %Np-Regel mit Relativsatz (Merkmale in Liste) np(Mm,[]) --> art(Mm), ap(Mm,0), n(Mm), relsatz(Mm). %Adjektivphrase leer oder maximal 3 Adjektive ap(_,_) --> []. ap(Mm,Zaehler) --> adj(Mm), {Zaehler < 3}, {ZaehlerNeu is Zaehler+1}, ap(Mm,ZaehlerNeu). %Lexikon %NP-Bestandteile art([nom,sing,mask,best|_]) --> [der]. art([akk,sing,mask,best|_]) --> [den]. art([dat,sing,mask,best|_]) --> [dem]. art([nom,sing,mask,unbest|_]) --> [ein]. art([akk,sing,mask,unbest|_]) --> [einen]. art([dat,sing,mask,unbest|_]) --> [einem]. art([nom,sing,mask,best|_]) --> [welcher]. art([akk,sing,mask,best|_]) --> [welchen]. art([dat,sing,mask,best|_]) --> [welchem]. art([nom,sing,neut,best|_]) --> [welches]. art([akk,sing,neut,best|_]) --> [welches]. art([dat,sing,neut,best|_]) --> [welchem]. art([nom,sing,fem,best|_]) --> [welche]. art([akk,sing,fem,best|_]) --> [welche]. art([dat,sing,fem,best|_]) --> [welcher]. art([nom,plu,mask,best|_]) --> [die]. n([nom,sing,mask|_]) --> [astronom]. n([nom,plu,mask|_]) --> [astronomen]. n([nom,sing,mask|_]) --> [planet]. n([akk,sing,mask|_]) --> [planeten]. n([nom,sing,neut|_]) --> [gestirn]. n([akk,sing,neut|_]) --> [gestirn]. n([nom,sing,fem|_]) --> [sonne]. n([akk,sing,fem|_]) --> [sonne]. relpron([nom,sing,mask|_]) --> [der]. relpron([akk,sing,mask|_]) --> [den]. %Adjektive adj([nom,sing,mask,best|_]) --> [blaue]. adj([akk,sing,mask,_|_]) --> [blauen]. adj([dat,sing,mask,_|_]) --> [blauen]. adj([nom,sing,mask,unbest|_]) --> [blauer]. adj(unfl) --> [blau]. adj(unfl) --> [rot]. %Finites Vollverb vfin(VRahmen,fvv) --> [entdeckt], {verbrahmenpermutationen(entdecken,sing,VRahmen)}. vfin(VRahmen,fvv) --> [entdecken], {verbrahmenpermutationen(entdecken,plu,VRahmen)}. vfin(VRahmen,fvv) --> [umkreist], {verbrahmenpermutationen(umkreisen,sing,VRahmen)}. vfin(VRahmen,fvv) --> [umkreisen], {verbrahmenpermutationen(umkreisen,plu,VRahmen)}. vfin(VRahmen,fvv) --> [hat], {verbrahmenpermutationen(haben,sing,VRahmen)}. vfin(VRahmen,fvv) --> [haben], {verbrahmenpermutationen(haben,plu,VRahmen)}. %finites Hilfverb vfin(_,fhv(sing)) --> [hat]. vfin(_,fhv(plu)) --> [haben]. %Wenn finites Vollverb die Klammer öffnet ist ein infiniter Verbteil nicht möglich vinf(_,fvv) --> []. %Wenn finites Hilfverb die Klammer öffnet, ist der infiniter Verbteil ein Partizip vinf(VRahmen,fhv(Num)) --> [entdeckt], {verbrahmenpermutationen(entdecken,Num,VRahmen)}. vinf(VRahmen,fhv(Num)) --> [umkreist], {verbrahmenpermutationen(umkreisen,Num,VRahmen)}. kopulaverb(sing) --> [ist]. %Ermittle den Verbrahmen für das Verb und ermögliche alle Permutationen verbrahmenpermutationen(Verb,Numerus,Verbrahmen) :- verbrahmen(Verb,Numerus,Verbrahmen_fest), permutation(Verbrahmen_fest,Verbrahmen). %Der (fixe) Rahmen für ein Verb; an dieser Stelle wird auch der Numerus in die NP-Merkmale eingefügt %Person wird nicht als Merkmal verwendet, könnte aber ebenfalls vorgesehen werden verbrahmen(entdecken,Numerus,[np([nom,Numerus|_]),np([akk|_])]). verbrahmen(umkreisen,Numerus,[np([nom,Numerus|_]),np([akk|_])]). verbrahmen(haben,Numerus,[np([nom,Numerus|_]),np([akk|_])]). %Hilfsprädikate; gültig für beliebige Listen permutation([],[]). permutation([K|R],L) :- permutation(R,L1), hinzufuegen(K,L1,L). hinzufuegen(K,L,[K|L]). hinzufuegen(K,[X|R],[X|R1]) :- hinzufuegen(K,R,R1). %Alternative Definition permutationA([],[]). permutationA(L,[K|R]) :- streiche(K,L,L_ohne_K), permutationA(L_ohne_K,R). streiche(K,[K|R],R). streiche(K,[X|R],[X|R1]) :- streiche(K,R,R1).