Einf. in das symbolische Programmieren CIS, SS 2006, H.Leiss ================================================================= Abgabe: Donnerstag, Do 6.7.06 bis 13 Uhr ---------------------------------------- Aufgabe 12 ---------- Schreiben Sie ein Programm, termanzeige/0, das folgenden Zweck erfüllt: Es fordert den Benutzer auf, einen Prolog-Term einzugeben, schreibt den Term als Baum formatiert (s.u. pretty_print/3) an den Bildschirm, fragt den Benutzer, ob er noch einen Term eingeben will, und macht bei Antwort 'ja' das Ganze nochmal, sonst hört es auf. 1. Schreiben Sie den Hinweis an den Bildschirm, daß der Term mit abzuschließen ist. 1 Punkt 2. Benutzen Sie das eingebaute read/1 zum Lesen der Benutzereingabe. 3. Übergeben Sie den eingelesenen Term an ein Prädikat pretty_print(+Strom,+Term,+Einschub) (mit Strom = user), das folgendes tut: (a) es zerlegt den Term mit dem eingebauten Prädikat '=..' in Funktionszeichen und direkte Teilterme; z.B. ?- f(a,g(b),c) =.. [Funktionszeichen|Teilterme]. ==> Funktionszeichen = f Teilterme = [a,g(b),c] (b) es schreibt das Funktionszeichen in eine neue Zeile mit dem angegebenen Einschub (Indentation) von N Leerzeichen (die man mit tab(N) schreiben kann); (c) dann schreibt es die direkten Teilterme mit dem Einschub von N+3 Leerzeichen alle untereinander (wobei jeder Teilterm selbst mit pretty_print geschrieben wird). 5 Punkte Falls Sie das nicht schaffen, schreiben Sie einfach den eingegebenen Term mit write/1 oder print/1 an den Bildschirm. 1 Punkt 3. Fragen Sie den Benutzer, ob er noch einen Term eingeben will, und geben Sie als Hinweis, daß die möglichen Antworten 'ja' oder 'nein' sind. 2 Punkte 4. Lesen Sie die Antwort mit read/1; bei Antwort 'ja' rufen Sie termanzeige/0 wieder auf, bei Antwort 'nein' (oder allen anderen) Schreiben Sie 'Danke, Ende der Termanzeige.' an den Bildschirm und hören auf. 3 Punkte Aufgabe 13 ---------- Schreiben Sie eine Datei lexikon.pl mit 10 Fakten der Form wort(Vollform,Kategorie,Stammform), wobei Sie als Kategorie Prolog-Terme Ihrer Wahl verwenden können, z.B. wort(geht,verb(person(3),numerus(sg),tempus(praes)),gehen). wort('Baums',nomen(genus(mask),numerus(sg),kasus(gen)),'Baum'). a) Schreiben Sie ein Prädikat lexikonanzeige(+Datei), das folgendes tut: Es öffnet die Datei zum Lesen, liest daraus der Reihe nach Prolog-Terme, prüft, ob sie Term von der Form wort(X,Y,Z) sind, und schreibt an den Bildschirm: Vollform: X Kategorie: Y Stammform: Z bzw. Formatfehler: der Term ist kein Lexikoneintrag je nachdem, ob der gelesene Term die Form wort(X,Y,Z) hatte oder nicht. Wenn das Ende der Datei erreicht ist (der Term ist 'end_of_file'), schließen Sie die geöffnete Datei und schreiben Fertig. an den Bildschirm. 8 Punkte Testen Sie ihr Programm mit Ihrer Datei lexikon.pl ! b) Ändern Sie das Programm aus a) so, daß es die formatierte Ausgabe der Lexikoneinträge in eine Ausgabedatei lexikon.txt schreibt, aber die Formatfehler nur am Bildschirm meldet. Vergessen Sie nicht, am Ende die Ausgabedatei zu schließen. 3 Punkte Hinweis: -------- 1. Sehen Sie sich das Beispiel der Altersabfrage und den Anfang des Satzenderkenners bzw. die Prädikate für das Öffnen/Schließen einer Datei auf den Folien an. 2. Um alle Terme der Datei anzuzeigen, kann man ein 0-stelliges Prädikat schreiben, das einen Term liest, ihn untersucht und ggf. etwas damit tut, und wenn es nicht der Term end_of_file war, sich anschliessend selbst aufruft (um weitere Terme zu lesen). 3. Es reicht nicht, wenn Sie erst am Mittwoch/Donnerstag damit anfangen!