Einf. in das symbolische Programmieren CIS, SS 2002, H.Leiss ================================================================= Abgabe: Mittwoch, 3.7.2002 in der Vorlesung ------------------------------------------- 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 Beispielsaetze in Prolog als Listen von Atomen eingeben muss. Nach Laden des Programms 'tokenizer.mini.pro', das ich ins Netz gestellt habe, kann man seine Eingabe einfach eintippen: 1 ?- ['tokenizer.mini.pro']. Warning: Singleton variables: [Stream] % tokenizer.mini.pro compiled 0.00 sec, 2,620 bytes 2 ?- satzende. Beende die Eingabe mit |: das ist meine Testeingabe. Eingabe: 'das ist meine Testeingabe.' % Echo der Eingabe als Atom Atomliste: [das, ist, meine, 'Testeingabe.'] % Eingabe als Atomliste Yes 3 ?- Aufgabe: a) Was muss an diesem Programm geaendert werden, damit der Punkt am Ende der Eingabe nicht mit dem letzten Wort verschmolzen wird? (2 Punkte) b) Aendere satzende/0 so zu einem Programm parse/0, dass nach der Umwandlung der Eingabe geprueft wird, ob die Atomliste ein Satz im Sinne der Grammatik-1 ist. (Dazu soll die Datei mit der DCG-Grammatik Grammatik-1 geladen sein.) (6 Punkte)