Lösungen zum Aufgabenblatt 9 Syntax natürlicher Sprachen Universität München, CIS, WS 2010/11 H. Leiß Abgabetermin: Do, 20.1.2011 Aufgabe 9.1 Nach der Feldertheorie des einfachen deutschen Satzes stehen der finite und die infiniten Prädikatsteile (ggf. auch satzeinleitende Konjunktionen) in der linken bzw. rechten Satzklammer“. Was in den Klammern“ steht, hängt von der Art des Satzes und der Verbstel” ” lung ab. Man kann daher die Schemata der einfachen Sätze aus dem Komplementrahmen des Verbs und der Besetzung der Satzklammern (einigermaßen genau) automatisch erzeugen. Eine solche Erzeugung haben wir in metaregeln.pl (vgl. Kursseite) in Prolog programmiert, zumindest für gewisse Verbstellungen und Komplementrahmen. (a) Erläutere das Prolog-Prädikat (Satz -+-> Konstituenten) aus metaregeln.pl bzw. den Folien! Was sind die Belegungen der Variablen nach dem Aufruf der einzelnen Bedingungen, wenn man jeweils nur die erste Lösung nimmt? D.h. • was ist Vst nach dem Aufruf von member(Vst,...), • was ist AktivRahmen,...,Mod nach dem Aufruf von praedikatsteile(...,Mod) (bei der ersten Belegung von Vst usw.), usw. • was ist Cats,Konstituenten nach dem Aufruf von listToTuple(Cats,Konstituenten)? Was tun also die Hilfsprädikate allgemein? Dazu müssen Sie natürlich deren Klauseln studieren. (b) Ändern sie die Bedingung für die Verbstellung, damit auch Regeln für Sätze in Verbzweitstellung erzeugt werden. Vielleicht müssen Sie auch Klauseln für praedikatsteile/8 ergänzen, damit sie DCG-Regeln für Verbzweitsaetze erzeugen können. (Für welche Verben müssen die Klauseln von praedikatsteile/8 von der Verbstellung Vst abhängen?) Geben Sie die Satzregeln an, die Sie mit dem Komplementrahmen [nom,akk] für die Verbstellung vz durch Anwenden von ersetze metaregeln/0 erzeugen können. (c) Ergänzen Sie die Datei np.pl (vgl. Kursseite) um ein Startsymbol für die Satzkategorie (mit den passenden Merkmalen) und die Anweisung :- [satzregeln,lexikon v]. zum Laden der neuen Regeln und eines Lexikons für (ein paar) Verbeinträge (wie in der Übungsstunde). Laden Sie np.pl und Parsen Sie mit den erzeugten Satzregeln den Beispielsatz der Hund beisst den Hund. Wie lautet die Analyse? 1 (d) (Freiwillig) Man sollte Sätze verschiedener Art unterscheiden, z.B. Aussagesätze von daßSätzen durch unterschiedliche Artmerkmale s([def],Form) und s([daß],Form’). Bei der Erzeugung der Satzregeln muß dann die Satzkategorie der linken Regelseite das richtige Artmerkmal tragen, ebenso die durch Expansion der Abkürzung daß entstehende Kategorie. Wie müssen Sie das Programm in metaregeln.pl dazu anpassen? Können Sie metaregeln.pl so anpassen, daß mit den erzeugten DCG-Regeln und dem Verb v([[nom,daß]],[3,sg,praes]) --> [glaubt] in lexikon v.pl auch ein Objektsatz erkannt wird, z.B. Maria glaubt dass der Hund den Hund beisst. ? Lösung von Aufgabe 9.1 (a) Eine erste Erklärung, was das Prolog-Prädikat -+-> der Datei soll, steht auf den Vorlesungsfolien (S.193): es sollen Grammatikregeln für einfache Sätze erzeugt werden, d.h. für Sätze aus Verb mit passendem Subjekt und Objekten. Ohne die Änderungen der Übungsstunde lautete die Prolog-Klausel: (s([Temp,Vst,Diath]) -+-> Konstituenten) :member(Vst,[ve,vl]), % Auswahl für Teilgrammatik! member(AktivRahmen,[[nom,refl(akk)],[nom,daß]]), praedikatsteile(AktivRahmen,Diath,SubjPos,Vst, VFIN,VINF, % = Praedikatsteile Rahmen,Pers,Num,Temp,Mod), expandiereSubjCat(SubjPos,[Pers,Num],Rahmen,SubjRahmen), anordnung(SubjRahmen,SubjRahmenPerm), nachfeld(SubjRahmenPerm,SubjRahmenPerm2,Nachfeld), verbstellung(SubjRahmenPerm2,Vst,RahmenPraed), append(RahmenPraed,Nachfeld,RahmenPraed2), expandiere([Pers,Num],RahmenPraed2,VFIN,VINF,Cats), listToTuple(Cats,Konstituenten). Was sind die Belegungen der Variablen nach dem Aufruf der einzelnen Bedingungen, wenn man jeweils nur die erste Lösung nimmt? Das kann man durch Überlegen am Programm aus metaregeln.pl ablesen, oder man testet es mit Prolog! • Die ersten beiden Zeilen belegen die Variablen Vst und Aktivrahmen mit ve für Verberststellung (z.B. Fragesätze, siehe Vorlesungsfolien) und [nom,refl(akk)] für reflexive Verben, genauer: Verben mit einem reflexiven Akkusativobjekt, z.B. wuninf inf dern:V[nom,refl(akk )] , nicht erlauben:V[nom,sich(dat),infzu] . • Die nächste Bedingung praedikatsteile(AktivRahmen,Diath,SubjPos,Vst, VFIN,VINF, % = Praedikatsteile Rahmen,Pers,Num,Temp,Mod), belegt für die Eingaben AktivRahmen=[nom,refl(akk)] und Vst=ve die anderen Variablen wie folgt, was man –wenn man es nicht an den Programmklauseln nachvollziehen will–, durch einen Prolog-Aufruf feststellen kann: ?- AktivRahmen=[nom,refl(akk)], Vst=ve, praedikatsteile(AktivRahmen,Diath,SubjPos,Vst, 2 VFIN,VINF, % = Praedikatsteile Rahmen,Pers,Num,Temp,Mod). AktivRahmen = [nom, refl(akk)], Vst = ve, Diath = aktiv, SubjPos = 1, VFIN = v([[nom, refl(akk)]], [Pers, Num, praes]), VINF = [[]], Rahmen = [nom, refl(akk)], Temp = praes, Mod = ind Man sieht, wie die Variablen belegt werden, z.B. Temp = praes, und daß Pers,Num nicht belegt werden. Insbesondere werden für den Satz im Präsens der finite Verbteil VFIN durch die Kategorie für reflexive Verben v([[nom,refl(akk)]],[Pers,Num,praes]) in finiter Form belegt, und der infinite Verbteil VINF durch die leere Liste4 bleibt leer. Im entsprechen die Fakten zu praedikatsteile/11 den Zeilen der Tabellen auf den Folien, und geben außerdem z.B. Merkmale aus den Verbteilen in Pers,Num aus, damit sie in die Subjektkategorie eingebaut werden können. • Die nächste Bedingung expandiert“ die Abkürzung nom für das Subjekt an Position ” 1 in Rahmen zu einem Kategorienausdruck für Nominalphrasen im Nominativ: ?- SubjPos=1,Rahmen=[nom,refl(akk)], expandiereSubjCat(SubjPos,[Pers,Num],Rahmen,SubjRahmen). SubjPos = 1, Rahmen = [nom, refl(akk)], SubjRahmen = [np([Pers, _G427, Num], [nom]), refl(akk)]. Beachte, daß Pers und Num in der Kategorie für das Subjekt mit den Merkmalen aus dem finiten Verb in VFIN übereinstimmen (ohne daß sie belegt sind) – das garantiert die Subjekt-Prädikat-Kongruenz; die Abkürzung refl(akk) für das Objekt ist noch nicht expandiert“. ” • Die nächste Bedingung anordnung(SubjRahmen,SubjRahmenPerm) erlaubt nach den Klauseln für anordnung/2 zwei Anordnungen: die unveränderte der Eingabeliste, und die Vertauschung ihrer zwei Elemente. Die erste Lösung ist die unveränderte Reihenfolge: ?- SubjRahmen = [np([Pers, _Gen, Num], [nom]), refl(akk)], anordnung(SubjRahmen,SubjRahmenPerm). SubjRahmen = [np([Pers, _Gen, Num], [nom]), refl(akk)], SubjRahmenPerm = [np([Pers, _Gen, Num], [nom]), refl(akk)] • Die folgende Bedingung soll festlegen, welche Teile in das Nachfeld (hinter den rechten Prädikatsteil) gestellt werden sollen: 4 eine Liste, da i.a. mehrere Wörter, z.B. die Infinitive von Voll- und Modalverb beim Perfekt, den infiniten Verbteil bilden, vgl. die Tabelle auf Folie 183 3 ?- SubjRahmenPerm = [np([Pers, _Gen, Num], [nom]), refl(akk)], nachfeld(SubjRahmenPerm,SubjRahmenPerm2,Nachfeld). SubjRahmenPerm = [np([Pers, _Gen, Num], [nom]), refl(akk)], SubjRahmenPerm2 = [np([Pers, _Gen, Num], [nom]), refl(akk)], Nachfeld = []. Im vorliegenden Fall bleibt das Nachfeld leer; an den Klauseln % daß-Sätze ins Nachfeld, ergänze daß-Korrelat: nachfeld([daß|ArgsPraed],[?(kor(daß))|ArgsPraed],[daß]). nachfeld([A|ArgsPraed],[A|ArgsPraed2],Nachfeld) :nachfeld(ArgsPraed,ArgsPraed2,Nachfeld). nachfeld([],[],[]). sieht man –mit etwas Prolog-Kenntnissen–, daß im allgemeinen Fall die Eingabe SubjRahmenPerm durchsucht wird, ob sie eine Abkürzung dass enthält; diese wird durch ?(kor(dass)) ersetzt, dafür dass ins Nachfeld getan, z.B. ?- nachfeld([nom,daß],SubjRahmenPerm2,Nachfeld). SubjRahmenPerm2 = [nom, ?(kor(daß))], Nachfeld = [daß] • Jetzt wird’s interessant: die nächste Bedingung soll, je nach der Verbstellung, Abkürzungen vfin,vinf für die Prädikatsteile an die richtigen Stellen in der Liste SubjRahmenPerm2 einfügen: ?- Vst=ve, SubjRahmenPerm2 = [np([Pers, _Gen, Num], [nom]), refl(akk)], verbstellung(SubjRahmenPerm2,Vst,RahmenPraed). Vst = ve, SubjRahmenPerm2 = [np([Pers, _Gen, Num], [nom]), refl(akk)], RahmenPraed = [vfin, np([Pers, _Gen, Num], [nom]), refl(akk), vinf] Wie in den Tabellen für die Satzschemata gesagt, soll bei der Verberstellung der finite Verbteil links, die Komplemente im Mittelfeld, und der infinite Prädikatsteil rechts stehen. • Die nächsten beiden Bedingungen erweitern diese Liste RahmenPraed (Komplement und Prädikat) um das (hier leere) Nachfeld, und expandieren alle Abkürzungen darin zu Kategorienausdrücken; die Belegung für VFIN und VINF von oben muß man als Eingabe berücksichtigen: ?- VFIN = v([[nom, refl(akk)]], [Pers, Num, praes]), VINF = [[]], Nachfeld=[], RahmenPraed = [vfin, np([Pers, _Gen, Num], [nom]), refl(akk), vinf], append(RahmenPraed,Nachfeld,RahmenPraed2), expandiere([Pers,Num],RahmenPraed2,VFIN,VINF,Cats). VFIN = v([[nom, refl(akk)]], [Pers, Num, praes]), VINF = [[]], Nachfeld = [], RahmenPraed = [vfin, np([Pers, _Gen, Num], [nom]), refl(akk), vinf], RahmenPraed2 = [vfin, np([Pers, _Gen, Num], [nom]), refl(akk), vinf], Cats = [v([[nom, refl(akk)]], [Pers, Num, praes]), 4 np([Pers, _Gen, Num], [nom]), pron([refl], [Pers, _G947, Num, akk]), [] ]. Statt vfin und vinf sind die Belegungen von VFIN und VINF berücksichtigt, und die Abkürzung refl(akk) wurde zu einer Kategorie für ein Reflexivpronomen mit den zum Subjekt passenden Numerus- und Personwerten Num und Pers expandiert. Das Ergebnis ist die Liste der Konstituentenkategorien. • Diese Liste wird durch die letzte Bedingung noch in die rechte Regelseite umgewandelt, das Tupel der Konstituentenkategorien: ?- Cats = [v([[nom, refl(akk)]], [Pers, Num, praes]), np([Pers, _Gen, Num], [nom]), pron([refl], [Pers, _G947, Num, akk]), [] ], listToTuple(Cats,Konstituenten). Cats = [v([[nom, refl(akk)]], [Pers, Num, praes]), np([Pers, _Gen, Num], [nom]), pron([refl], [Pers, _G947, Num, akk]), [] ], Konstituenten = (v([[nom, refl(akk)]], [Pers, Num, praes]), np([Pers, _Gen, Num], [nom]), pron([refl], [Pers, _G947, Num, akk]), [] ) Damit wissen wir, wie die erste Lösung des Aufrufs (s([Temp,Vst,Diath]) -+-> Konstituenten). die Variablen darin belegt; also bildet ersetze metaregeln als erstes die DCG-Regel s([praes,ve,aktiv]) --> v([[nom, refl(akk)]], [Pers, Num, praes]), np([Pers, _Gen, Num], [nom]), pron([refl], [Pers, _G947, Num, akk]), []. und schreibt sie in die Ausgabedatei satzregeln.pl! Man hätte in Prolog auch mit ?- trace([praedikatsteile/11,expandiereSubjCat/4,anordnung/2,nachfeld/3, verbstellung/3,expandiere/5,listToTuple/2],[exit]). die relevanten Prädikate zum tracen“ markieren können und dann mit ” ?- (s(Merkmale) -+-> Konstituenten). 5 T Call: (7) praedikatsteile([nom, akk], _G425, _G481, ve, _G483, _G484, _G485, _G486, _G487, _G419, _G489) T Exit: (7) praedikatsteile([nom, akk], aktiv, 1, ve, v([[nom, akk]], [_G461, _G464, praes]), [[]], [nom, akk], _G461, _G464, praes, ind) T Call: (7) expandiereSubjCat(1, [_G461, _G464], [nom, akk], _G506) T Exit: (7) expandiereSubjCat(1, [_G461, _G464], [nom, akk], [np([_G461, _G485, _G464], [nom]), akk]) T Call: (7) anordnung([np([_G461, _G485, _G464], [nom]), akk], _G531) T Exit: (7) anordnung([np([_G461, _G485, _G464], [nom]), akk], [np([_G461, _G485, _G464], [nom]), akk]) ... auf einmal gezeigt bekommen, welche Ergebnisse durch die Bedingungen erzeugt werden (aber mit unverständlichen Variablennamen)! (b) Um Satzregeln für die Verbzweitstellung zu erzeugen, muß man nur am Anfang die Variable Vst mit vz belegen (oder die Belegung von Vst weglassen, dann werden mit praedikatsteile alle 3 Verbstellungen durchlaufen.) Dann erhält man die Verbzweitsätze mit Subjekt oder Objekt vor dem finiten Verb: ?- (s(Merkmale)-+->Konstituenten). Merkmale = [praes, ve, aktiv], Konstituenten = ... Merkmale = [praes, vz, aktiv], Konstituenten = (np([_G323, _G347, _G326], [nom]), v([[nom, akk]], [_G323, _G326, praes]), np([_G425, _G428, _G431], [akk]), []) ; Merkmale = [praes, vz, aktiv], Konstituenten = (np([_G419, _G422, _G425], [akk]), v([[nom, akk]], [_G323, _G326, praes]), np([_G323, _G347, _G326], [nom]), []) ; ... In praedikatsteile/8 müssen entsprechend den Schemata der Folien die Klauseln, von Vst abhängen, die für Verben mit abtrennbarem Präfix dienen: für aufhören ist bei Vst=vz in VINF das abgetrennte Präfix anzugeben; z.B. Er hört damit auf. (c) ?- parse. der Hund beisst den Hund. ... Aufruf: s([_, _, _], _, [der, ’Hund’, beisst, den, ’Hund’], []). Baum: s([praes, vz, aktiv]) np([3, mask, sg], [nom]) det([3, sg, sw], [mask, nom]) art([sw, sg], [mask, nom]) der 6 n1([mask], [sw, sg, nom]) n([[], mask], [sg, nom]) cn([mask], [sg, nom]) ’Hund’ v([[nom, akk]], [3, sg, praes]) beisst np([3, mask, sg], [akk]) det([3, sg, sw], [mask, akk]) art([sw, sg], [mask, akk]) den n1([mask], [sw, sg, akk]) n([[], mask], [sg, akk]) cn([mask], [sg, akk]) ’Hund’ (d) Die Satzkategorie der Metaregel sieht beim Satz die Formmerkmale [Temp,Verbstellung,Diathese] vor, aber keine Satzarten. Das muß also zum gewünschten Format geändert werden, und außerdem muß die Satzart von der Verbstellung abhängen: (s([Def],[Temp,Vst,Diath]) -+-> Konstituenten) :% Definitheit des Satzes an der Verbstellung ablesen: ( Vst = ve, Def = qu % Fragesaetze ; Vst = vz, Def = def % Aussagesaetze ; Vst = vl, % Relativsaetze und dass-Saetze (Def = rel ; Def = daß) ), ... listToTuple(Cats,Konstituenten). Auch in np.pl bei den Startsymbolen muß das Format der Satzkategorie angepaßt werden: startsymbol(s([Def],[Temp,Vst,Diath])). Im Lexikon lexikon v.pl muß gesagt werden, daß glauben einen Objektsatz erwartet: v([[nom,daß]],[3,sg,praes]) --> [glaubt]. v([[nom,daß]],[3,sg,praet]) --> [glaubte]. v([[nom,daß]],[inf]) --> [glauben]. Und in metaregel.pl muß die Abkürzung daß zu einer entsprechenden Satzkategorie expandiert werden: expandiereCat(daß,s([daß],[_Temp,vl,_Diathese])) :- !. Daß die Korrelate für daß-Sätze optional sind, sollte ursprünglich durch ?(korr(daß)) angedeutet werden. Damit wir zur Behandlung von ?(X) den Parser nicht ausbauen müssen, ersetzen wir das in nachfeld/3 durch nachfeld([daß|ArgsPraed],[kor(daß)|ArgsPraed],[daß]). nachfeld([daß|ArgsPraed],ArgsPraed,[daß]). % nur dass-Satz im Nachfeld nachfeld([daß|ArgsPraed],[kor(daß)|ArgsPraed],[]). % nur Korrelat-es und durch eine Grammatikregel, die wir ebenfalls in satzregeln.pl ausgeben lassen: (kor(daß) -+-> [es]). Schließlich braucht man noch eine Regel für daß-Sätze, die wir aus definiten VerbletztSätzen explizit aufbauen: 7 (s([daß],[Temp,vl,Diath]) -+-> ([daß];[dass]), s([def],[Temp,vl,Diath])). Damit erhält man die gewünschten Objektsätze, und optinal ein Korrelat-es im Mittelfeld: parse. |: Maria glaubt es dass der Hund den Hund beisst. Aufruf: s([_], [_, _, _], _, [’Maria’, glaubt, es, dass, der, ’Hund’, den, ’Hund’, beisst], []). Baum: s([def], [praes, vz, aktiv]) np([3, fem, sg], [nom]) pn([fem], [nom]) ’Maria’ v([[nom, daß]], [3, sg, praes]) glaubt kor(daß) es s([daß], [praes, vl, aktiv]) dass s([def], [praes, vl, aktiv]) np([3, mask, sg], [nom]) det([3, sg, sw], [mask, nom]) art([sw, sg], [mask, nom]) der n1([mask], [sw, sg, nom]) n([[], mask], [sg, nom]) cn([mask], [sg, nom]) ’Hund’ np([3, mask, sg], [akk]) det([3, sg, sw], [mask, akk]) art([sw, sg], [mask, akk]) den n1([mask], [sw, sg, akk]) n([[], mask], [sg, akk]) cn([mask], [sg, akk]) ’Hund’ v([[nom, akk]], [3, sg, praes]) beisst true. parse. |: dass der Hund den Hund beisst glaubt Maria. Aufruf: s([_], [_, _, _], _, [dass, der, ’Hund’, den, ’Hund’, beisst, glaubt, ’Maria’], []). Baum: s([def], [praes, vz, aktiv]) s([daß], [praes, vl, aktiv]) dass s([def], [praes, vl, aktiv]) np([3, mask, sg], [nom]) det([3, sg, sw], [mask, nom]) art([sw, sg], [mask, nom]) der n1([mask], [sw, sg, nom]) n([[], mask], [sg, nom]) cn([mask], [sg, nom]) ’Hund’ 8 np([3, mask, sg], [akk]) det([3, sg, sw], [mask, akk]) art([sw, sg], [mask, akk]) den n1([mask], [sw, sg, akk]) n([[], mask], [sg, akk]) cn([mask], [sg, akk]) ’Hund’ v([[nom, akk]], [3, sg, praes]) beisst v([[nom, daß]], [3, sg, praes]) glaubt np([3, fem, sg], [nom]) pn([fem], [nom]) ’Maria’ true. Man kann auch gleich daß-Sätze schachteln: ?- parse. |: Maria glaubt dass der Hund es glaubt dass Maria es glaubt. Aufruf: s([_], [_, _, _], _, [’Maria’, glaubt, dass, der, ’Hund’, es, glaubt, dass, ’Maria’, es, glaubt], []). Baum: s([def], [praes, vz, aktiv]) np([3, fem, sg], [nom]) pn([fem], [nom]) ’Maria’ v([[nom, daß]], [3, sg, praes]) glaubt s([daß], [praes, vl, aktiv]) dass s([def], [praes, vl, aktiv]) np([3, mask, sg], [nom]) det([3, sg, sw], [mask, nom]) art([sw, sg], [mask, nom]) der n1([mask], [sw, sg, nom]) n([[], mask], [sg, nom]) cn([mask], [sg, nom]) ’Hund’ kor(daß) es v([[nom, daß]], [3, sg, praes]) glaubt s([daß], [praes, vl, aktiv]) dass s([def], [praes, vl, aktiv]) np([3, fem, sg], [nom]) pn([fem], [nom]) ’Maria’ kor(daß) es v([[nom, daß]], [3, sg, praes]) glaubt 9