Einf. in das symbolische Programmieren CIS, SS 2006, H.Leiss ================================================================= Abgabe: Donnerstag, 20.7.06 bis 13 Uhr -------------------------------------- Aufgabe 14 ---------- Aendern Sie den Satzende-Erkenner und Tokenizer (der Kursseite) so, dass er Ordnungszahlen wie '23.' ((der|die|das) dreiundzwanzigste)) als ein Token betrachtet, sofern ein Leerzeichen, Sonderzeichen oder ein Zeilenumbruch folgt. Punkte 5 (Das Programm von der Kursseite zerlegt die Eingabe dagegen wie folgt: ?- eingabe. Beende die Eingabe mit <.|?> |: der 24. 12. ist nocht nicht der 31.12. des Jahres. [der, 24, '.', 12, '.', ist, nocht, nicht, der, 31, '.', 12, '.', des, 'Jahres', '.'] Nach der Aenderung sollten Sie stattdessen erhalten: ?- eingabe. Beende die Eingabe mit <.|?> |: der 24. 12. ist nocht nicht der 31.12. des Jahres. [der, '24.', '12.', ist, nocht, nicht, der, 31, '.', 12, '.', des, 'Jahres', '.'] Anzahlen wir 90.000 werden dann immer noch in drei Token zerlegt.) Aufgabe 15 ---------- Wir beginnen mit der einfachen DCG-Grammatik: % --------------- Grammatik-1 --------------------- % Regeln: s --> np, vp. np --> det, n. np --> det, n, s. vp --> v, np. vp --> v. % Lexikon: det --> [der]. det --> [die]. det --> [das]. n --> ['Programmierer']. n --> ['Programm']. n --> ['Programme']. v --> [schreibt]. v --> [schreiben]. v --> [laeuft]. v --> [laufen]. % --------------- Grammatik-1 (Ende) --------------- a) Lade das Programm in Prolog und teste, welche der folgenden Beispielsaetze es erkennt: (0 Punkte) 1. der Programmierer laeuft. 2. das Programm der Programmierer laeuft. 3. die Programmierer schreiben die Programme. 4. der Programmierer, der das Programm schreibt, laeuft. Zur Erinnerung: Die Grammatikregeln werden beim Einlesen in Prolog-Klauseln uebersetzt, die Kategorien in Praedikate mit 2 (weiteren) Argumenten. np --> det, n. wird zu np(I,J) :- det(I,K), n(K,J). Man testet also wie in: ?- np([der, 'Programmierer'],[]). b) Aendern Sie die Grammatik-1 so in eine Grammatik-2, dass 1. die Kongruenz von Genus, Numerus und Kasus in einer NP ueberprueft wird, also z.B. das Programmierer, das Programme nicht mehr als NP akzeptiert werden. (6 Punkte) (Einfachheitshalber soll man Lexikoneintraege des Artikels und der Nomen nur im Nominativ und Akkusativ angeben!) 2. die Kongruenz des Numerus des Verbs und der Subjekt-NP ueberprueft wird, also die Programmierer schreibt das Programm nicht mehr als Satz akzeptiert wird. (4 Punkte) Dazu muessen die Kategorien der Grammatik um entsprechende Argumentstellen ergaenzt werden. c) Erweitere die Grammatik-1 um Regeln, mit denen die Beispiele 2. und 4. erkannt werden. (6 Punkte) Aufgabe 16 (10 Punkte) ---------- Erweitere die Grammatik-1 aus Aufgabe 15 um eine Ausgabe des Syntaxbaums zu einer Grammatik-3, wie folgt. In jeder Grammatikregel soll jede Kategorie ein Argument erhalten, das nach der Analyse der Eingabe den Syntaxbaum der jeweiligen Konstituente enthaelt. Die Kategorien der Grammatik-3 haben also die Form s(Baum),...,n(Baum). Eine Regel, etwa "a --> b,c.", soll die Form a(Baum) --> b(Teilbaum1), c(Teilbaum2), {Baum = a(Teilbaum1,Teilbaum2)}. erhalten. Die Lexikalischen Regeln, etwa "a --> ['Wort'].", sollen die Form a(Baum) --> ['Wort'], {Baum = a(Wort)}. erhalten. Gib den bei der Analyse von Beispiel 3 erzeugten Baum an! Freiwillig: ---------- Es ist muehsam, dass man einer DCG die Beispielsaetze als Listen von Prolog-Atomen geben muss. Der Satzende-Erkenners/Tokenizer der Kursseite erlaubt mit eingabe :- write(user,'Beende die Eingabe mit <.|?>'), nl,read_sentence(user,Sentence,[]), stringToAtoms(Sentence,Atomlist), nl,writeq(Atomlist). dass man einen Satz eintippt, und macht daraus eine Atomliste. Modifiziere das Praedikat eingabe/0 zu einem Prädikat erkenne/0, das zusaetzlich prueft, ob die erzeugte Atomliste (ohne das letzte Atom '.') ein Satz im Sinne der Grammatik-1 ist. (Dazu muessen der Tokenizer, das Praedikat erkenne/0 und die DCG-Grammatik Grammatik-1 geladen sein.) (6 Punkte)