Prolog-Übung 2 24.11.2009 1) Rätsel: Gegeben sind folgende 6 Wörter: abalone, abandon, anagram, connect, elegant, enhance Formulieren Sie ein Prädikat kreuzwort/6, welches alle möglichen Anordnungen dieser Wörter in folgendem Raster angibt: Die ersten 3 Argumente sollten dabei den vertikalen Wörtern entsprechen, die letzten 3 Argumente sollen den horizontalen Wörtern entsprechen. Tipp: Überlegen Sie zu Beginn, welche Eigenschaften die einzelnen Buchstaben der Wörter erfüllen müssen,d amit sie in das Raster passen. 2) Peano-Axiome a) Implementieren Sie die in der Vorlesung besprochene Defintion der natürlichen Zahlen mit Hilfe der Peano-Axiome in Prolog. Definieren Sie weiters: • Ein Prädikat add/2, welches 2 natürliche Zahlen unter Verwendung der PeanoArithmetik addiert. • Ein Prädikat mult/2, welches 2 natürliche Zahlen unter Verwendung der PeanoArithmetik multipliziert. • Ein Prädikat kleiner_als/2, welches “true” liefert, wenn eine Zahl X kleiner als eine Zahl Y ist, andernfalls “false”. Gestalten sie die Prädikate add/2, mult/2, kleiner_als/2 so, dass Ein- und der Zahl in “Peano-Schreibweise” erfolgen. Ausgabe b) Definieren Sie: • Ein Prädikat encode/2, welches eine beliebige nat. Zahl in “Peano-Schreibweise” ausgibt. • Ein Prädikat decode/2, welches eine Zahl in “Peano-Schreibweise” in die zugehörige nat. Zahl in “normaler” Schreibweise umwandelt. • Gestalten sie unter Verwendung der beiden Prädikate encode/2 und decode/2 eine alternative Version der Prädikate add/2, mult/2, kleiner_als/2, sodass Ein- und Ausgabe der Zahlen in “normaler” Schreibweise erfolgen kann. 3) Entwerfen Sie ein “Sicherheitssystem” für folgendes Bürogebäude: a) Halten Sie die Topologie des Büros in einem Prolog-Programm fest. Nach der Fertigstellung wollen wir mit der folgenden Abfrage feststellen können, ob zwei Räume verbunden sind: % Sind Raum a und b verbunden? ?- tuer(a, b). true b) Wenn eine Tür von a nach b geht, geht diese natürlich auch von b nach a. Stellen Sie sicher, dass Ihr Programm dies unterstützt. Stellen Sie weiterhin sicher, dass Abfragen wie tuer(X, a) ebenfalls funktionieren. Ein Hinweis: Eine triviale Lösung wäre es, jede Tür zweimal in die Datenbank a aufzunehmen (für beide Richtungen). Versuchen Sie, eine Lösung ohne Redundanz zu finden. Folgende Aufgaben erst nach der Vorlesung vom Mittwoch, dem 24.11.2009 (Thema Listen in Prolog). c) Erstellen Sie eine Regel erreichbar(Raum1, Raum2), die true ergibt, wenn zwei Räume verbunden sind. Erstellen Sie eine Regel erreichbar(Raum1, Raum2, Weg), die den Weg (bzw. Alle möglichen Wege) zwischen zwei Räumen ausgibt. Benutzen Sie dafür Listen, sowie die eingebaute member-Funktion (mehr dazu in Prolog mittels ?-help(member)). c) Nun sollen Nutzer eingeführt werden, die nur Zugang zu bestimmten Räumen haben. Entwickeln Sie eine Datenstruktur, welche die Benutzungsrechte festhält. Definieren sie die Rechte für 2 fiktive Benutzer. e) Nutzer müssen von Außerhalb (also “outside” im Plan) zu den Räumen kommen, zu denen sie Zugang haben. Schreiben Sie also ein Programm das prüft, ob ein Nutzer zu einem Raum Zugangsrechte hat, und diesen Raum auch von outside erreichen kann (der Nutzer muss also auch für alle Räume, die zwischen outside und dem Raum l iegen, Zugangsrechte haben).