Tutoraufgabe 1 (Programmieren in Prolog):

Ähnliche Dokumente
Tutoraufgabe 1 (Programmieren in Prolog):

Tutoraufgabe 1 (Auswertungsstrategie):

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Verkettete Datenstrukturen: Bäume

Tutoraufgabe 1 (2 3 4 Bäume):

12 Abstrakte Klassen, finale Klassen und Interfaces

Programmieren in Java -Eingangstest-

Klausur: Java (Liste P)

4.1 Bäume, Datenstrukturen und Algorithmen. Zunächst führen wir Graphen ein. Die einfachste Vorstellung ist, dass ein Graph gegeben ist als

Klausur Software-Entwicklung März 01

Tutoraufgabe 1 (2 3 4 Bäume):

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Institut für Informatik und Angewandte Kognitionswissenschaften

Punkte. Teil 1. Teil 2. Summe. 1. Zeigen Sie, dass der untenstehende Suchbaum die AVL-Bedingung verletzt und überführen Sie ihn in einen AVL-Baum.

13. Bäume: effektives Suchen und Sortieren

Programmierkurs Java

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 14. Bäume. Bäume 1

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Probeklausur: Programmierung WS04/05

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Aufgabe 1 (Programmanalyse, Punkte)

TECHNISCHE UNIVERSITÄT MÜNCHEN. Abgabe: (vor der Vorlesung)

Allgemeine Informatik II SS :30-13:30 Uhr

Verkettete Datenstrukturen: Listen

Übungen zu Programmierung I - Blatt 8

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

5 Logische Programmierung

Tutoraufgabe 1 (Fibonacci-Zahlen):

Einführung in die Programmierung

Institut für Programmierung und Reaktive Systeme 17. Juli Programmieren II. Übungsklausur

Programmieren in Java

Binary Decision Diagrams (Einführung)

Informatik Abitur Bayern 2017 / II - Lösung

In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht:

Tutoraufgabe 1 (Listen):

Idee: Wenn wir beim Kopfknoten zwei Referenzen verfolgen können, sind die Teillisten kürzer. kopf Eine Datenstruktur mit Schlüsselwerten 1 bis 10

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2

3 Objektorientierte Konzepte in Java

Kapitel 12: Induktive

Prof. Dr. Uwe Schmidt. 30. Januar 2017

Datenstrukturen Teil 2. Bäume. Definition. Definition. Definition. Bäume sind verallgemeinerte Listen. Sie sind weiter spezielle Graphen

Kapitel 5: Interfaces

Klausur Grundlagen der Programmierung

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Einstieg in die Informatik mit Java

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Wiederholung. Bäume sind zyklenfrei. Rekursive Definition: Baum = Wurzelknoten + disjunkte Menge von Kindbäumen.

1 Der Baum. Informatik I: Einführung in die Programmierung 11. Bäume. Bäume in der Informatik. Bäume in der Informatik - Definition.

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

Funktionale Programmierung. Das Funktionale Quiz. Das Funktionale Quiz. Das Funktionale Quiz

Institut für Programmierung und Reaktive Systeme 24. Juni Programmieren II. 14. Übungsblatt

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Aufgabe 1 (Programmanalyse):

1.) Zahlensysteme (10 Punkte)

Institut für Informatik

Objektorientierte Programmierung Einstufungstest

Programmierpraktikum

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

5.14 Generics. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Algorithmen und Datenstrukturen I AVL-Bäume

1 Abstrakte Klassen, finale Klassen und Interfaces

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

1. Aufgabe (6 Punkte): Java-Programmierung (Arrays)

Klausur Formale Systeme Fakultät für Informatik WS 2009/2010. Prof. Dr. Bernhard Beckert. 18. Februar 2010

Probeklausur: Einführung in die objektorientierte Programmierung mit Java 15WS

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

368 4 Algorithmen und Datenstrukturen

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Informatik II, SS 2014

Binärbäume: Beispiel

Tutoraufgabe 1 (Datenstrukturen in Haskell):

5 BINÄRE ENTSCHEIDUNGS- DIAGRAMME (BDDS)

Tutoren Simon Andermatt Lukas Beck. Alexis Peter Thomas Ritter

Tutoraufgabe 1 (Vollständige Induktion): Tutoraufgabe 2 (Rotationen): Datenstrukturen und Algorithmen SS15 Übungsblatt 5 (Abgabe 3.6.

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

1 Der Baum. Informatik I: Einführung in die Programmierung 11. Bäume. Bäume in der Informatik. Bäume in der Informatik - Definition.

ALP II Dynamische Datenmengen Datenabstraktion

12 (2-4)-Bäume Implementierbare Funktionen. (2-4)-Bäume sind durch folgende Eigenschaften deniert: 1. Alle Äste sind gleich lang

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

a) Fügen Sie die Zahlen 39, 38, 37 und 36 in folgenden (2, 3)-Baum ein:

Vorlesung Künstliche Intelligenz Alexander Manecke Oliver Schneider Andreas Stoffel 9. Mai 2006

Institut für Programmierung und Reaktive Systeme 7. Juli Programmieren II. Übungsklausur

Datenstrukturen & Algorithmen Lösungen zu Blatt 4 FS 15

Informatik B Sommersemester Musterlösung zur Klausur vom

Tag 7. Pattern Matching und eigene Datentypen

Technische Universität München WS 2004/2005 Fakultät für Informatik 11. Dezember 2004 Prof. Dr. Seidl

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Grundlagen der Programmierung 2. Bäume

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Kapitel 4: Dynamische Datenstrukturen. Algorithmen und Datenstrukturen WS 2012/13. Prof. Dr. Sándor Fekete

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

Selbsteinstufungstest Vorkurs Programmieren

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Tutoraufgabe 1 (Programmanalyse):

Transkript:

Prof. aa Dr. J. Giesl Programmierung WS1/13 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder Tutoraufgabe 1 (Programmieren in Prolog): In dieser Aufgabe sollen einige Abhängigkeiten im Übungsbetrieb Programmierung in Prolog modelliert und analysiert werden. Die gewählten Personennamen sind frei erfunden und eventuelle Übereinstimmungen mit tatsächlichen Personennamen sind purer Zufall. Person Rang J. Giesl (jgi) Professor M. Brockschmidt (mbr) Assistent F. Emmes (fem) Assistent C. Otto (cot) Assistent T. Ströder (tst) Assistent T. Janson (tja) Tutor O. Kautz (oka) Tutor F. Ail (fai) Student N. Erd (ner) Student M. Ustermann (mus) Student Schreiben Sie keine Prädikate außer den geforderten und nutzen Sie bei Ihrer Implementierung jeweils Prädikate aus den vorangegangenen Aufgabenteilen. a) Übertragen Sie die Informationen der Tabelle in eine Wissensbasis für Prolog. Geben Sie hierzu Fakten für die Prädikatssymbole person und hatrang an. Hierbei gilt person(x), falls X eine Person ist und hatrang(x, Y), falls X den Rang Y hat. b) Stellen Sie eine Anfrage an das im ersten Aufgabenteil erstellte Programm, mit der man herausfinden kann, wer ein Assistent ist. Hinweise: Durch die wiederholte Eingabe von ; nach der ersten Antwort werden alle Antworten ausgegeben. c) Schreiben Sie ein Prädikat bossvon, womit Sie abfragen können, wer innerhalb der Übungsbetriebshierarchie einen Rang direkt über dem eines anderen bekleidet. Die Reihenfolge der Ränge ist Professor > Assistent > Tutor > Student. So ist z.b. bossvon(mbr,tja) wahr, während bossvon(tst,fai) und bossvon(tja,mbr) beide falsch sind. d) Stellen Sie eine Anfrage, mit der Sie herausfinden, zu wem es jemand anderen gibt, der in der Übungsbetriebshierarchie genau eine Stufe darunter steht. Es soll bei jeder Antwort nur derjenige auf dem jeweils höheren Rang, nicht aber derjenige auf dem niedrigeren Rang ausgegeben werden. Mehrfache Antworten mit dem gleichen Ergebnis sind allerdings erlaubt. e) Schreiben Sie nun ein Prädikat hatgleichenrang mit einer Regel (ohne neue Fakten), mit dem Sie alle Paare von Personen abfragen können, die den gleichen Rang innerhalb des Übungsbetriebs bekleiden. So ist z.b. hatgleichenrang(mbr, tst) wahr, während hatgleichenrang(tja, fai) falsch ist. Stellen Sie sicher, dass hatgleichenrang(x, Y) nur dann gilt, wenn X und Y Personen sind. f) Schreiben Sie schließlich ein Prädikat vorgesetzt mit zwei Regeln (wieder ohne neue Fakten), mit dem Sie alle Paare von Personen abfragen können, sodass die erste Person in der Übungsbetriebshierarchie der zweiten Person vorgesetzt ist. Eine Person X ist einer Person Y vorgesetzt, wenn der Rang von X größer als der Rang von Y ist (wobei wieder Professor > Assistent > Tutor > Student gilt). So sind z.b. vorgesetzt(mbr, tja) und vorgesetzt(tst, fai) beide wahr, während vorgesetzt(tja, mbr) falsch ist. Stellen Sie auch hier sicher, dass vorgesetzt(x, Y) nur dann gilt, wenn X und Y Personen sind. 1

% Teilaufgabe a) person ( jgi ). person ( mbr ). person ( fem ). person ( cot ). person ( tst ). person ( tja ). person ( oka ). person ( fai ). person ( ner ). person ( mus ). hatrang ( jgi, professor ). hatrang ( mbr, assistent ). hatrang ( fem, assistent ). hatrang ( cot, assistent ). hatrang ( tst, assistent ). hatrang (tja, tutor ). hatrang (oka, tutor ). hatrang ( fai, student ). hatrang ( ner, student ). hatrang ( mus, student ). % Teilaufgabe b) % hatrang (X, assistent ). % Ausgabe : %X = mbr ; %X = fem ; %X = cot ; %X = tst. % Teilaufgabe c) bossvon (X, Y) :- hatrang (X, professor ), hatrang (Y, assistent ). bossvon (X, Y) :- hatrang (X, assistent ), hatrang (Y, tutor ). bossvon (X, Y) :- hatrang (X, tutor ), hatrang (Y, student ). % Teilaufgabe d) % bossvon (X, _). % Ausgabe : %X = jgi ; %X = jgi ; %X = jgi ; %X = jgi ; %X = mbr ; %X = mbr ; %X = fem ; %X = fem ; %X = cot ; %X = cot ; %X = tst ; %X = tst ; %X = tja ; %X = tja ; %X = tja ; %X = oka ; %X = oka ;

%X = ok ; % false. % Teilaufgabe e) hatgleichenrang (X, Y) :- person (X), person (Y), hatrang (X, R), hatrang (Y, R). % Teilaufgabe f) vorgesetzt (B, S) :- bossvon (B, S), person (B), person (S). vorgesetzt (B, S) :- bossvon (B, X), person (B), vorgesetzt (X, S). Aufgabe (Programmieren in Prolog): Wir betrachten die Java-Klassenhierarchie aus der Präsenzübung: ( + 1 + + = 7 Punkte) «abstract» Kunstobjekt - String kuenstler Malerei - String untergrund Zeichnung - double linienstaerke Bildhauerei - String material + void verruecken() Portrait - int alter «interface» Aufhaengbar + void aufhaengen() Plastik - double volumen Skulptur - String werkzeug a) Übertragen Sie die Klassenhierarchie in eine Wissensbasis für Prolog. Beschränken Sie sich hierbei auf die Namen der Klassen und des Interfaces. Verwenden Sie die zweistelligen Prädikate extends und implements, so dass extends(a, B) gilt wenn die Klasse A (direkt) die Klasse B erweitert (also A extends B im Quellcode stehen würde). Die Bedeutung von implements ist analog zu verstehen. b) Schreiben Sie eine Anfrage, die alle Klassen als Antwort zurückgibt, die die Klasse Kunstobjekt direkt erweitern. c) Schreiben Sie das zweistellige Prädikat instanceof. Der Aufruf instanceof(a, B) soll wahr sein, wenn A und B identisch sind, oder A eine Klasse bzw. Interface M direkt erweitert/implementiert und instanceof(m, B) gilt d) Erweitern Sie die Wissensbasis um Fakten nichtabstract(x) für alle Klassen X, die weder abstract noch ein interface sind. Schreiben Sie anschließend das zweistellige Prädikat instanzmoeglich. Der Aufruf instanzmoeglich(a, B) soll wahr sein, wenn eine Java-Variable vom Typ A auf ein Objekt der Klasse B verweisen kann. Berücksichtigen Sie hier, dass es zwar Variablen vom Typ einer abstrakten Klasse oder eines Interfaces geben kann, aber in dieser Variable nur Objekte von nicht-abstrakten Klassen stehen können. 3

% a) extends ( malerei, kunstobjekt ). extends ( zeichnung, kunstobjekt ). extends ( bildhauerei, kunstobjekt ). extends ( plastik, bildhauerei ). extends ( skulptur, bildhauerei ). extends ( portrait, malerei ). implements ( portrait, aufhaengbar ). implements ( zeichnung, aufhaengbar ). % b) %?- extends ( X, kunstobjekt ). % X = malerei ; % X = zeichnung ; % X = bildhauerei ; % c) instanceof (A, A). instanceof (A, Z) :- extends (A, M), instanceof (M, Z). instanceof (A, Z) :- implements (A, M), instanceof (M, Z). % d) nichtabstract ( malerei ). nichtabstract ( zeichnung ). nichtabstract ( portrait ). nichtabstract ( bildhauerei ). nichtabstract ( skultur ). nichtabstract ( plastik ). instanzmoeglich (A, Z) :- instanceof (Z, A), nichtabstract (Z). Tutoraufgabe 3 (Programmieren mit Listen in Prolog): In dieser Aufgabe geht es darum, Bahnhof zu verstehen. Ein Bahnhof hat eine begrenzte Anzahl n N von Gleisen und ein unbegrenzt langes Wartegleis. Die Idee ist, dass ein ankommender Zug sich hinten bei den wartenden Zügen einreiht. Wenn bislang kein Zug wartet, dann steht der neue Zug entsprechend vorne auf dem Wartegleis. Sobald im Bahnhof ein Gleis frei ist, fährt der Zug, der am längsten wartet, auf dieses Gleis. Auf jedem Gleis des Bahnhofs kann maximal ein Zug stehen. Auf dem Wartegleis können hingegen beliebig viele Züge stehen. Implementieren Sie in dieser Aufgabe Datenstrukturen und Prädikate, um mit solchen Bahnhöfen zu arbeiten. Benutzen Sie für Züge ein einstelliges Funktionssymbol, so dass jeder Zug eine Zahl als Wert hat. Als Beispiel stehen hier die Terme zug(1) und zug() für die Züge Zug 1 und Zug. a) Verwenden Sie für Bahnhöfe ein zweistelliges Funktionssymbol bahnhof(wartegleis, Gleise), so dass im ersten Argument das Wartegleis repräsentiert ist und das zweite Argument Informationen über die Gleise enthält. Verwenden Sie für die Terme in den beiden Argumenten jeweils die vordefinierten Listen. Geben Sie freie Gleise durch die Konstante frei an, belegte Gleise durch den Term des entsprechenden Zuges. Geben Sie für die von Ihnen gewählte Darstellung der Datenstruktur die Termdarstellung eines Bahnhofs B an, wobei der Zug Zug 3 auf dem Wartegleis steht der Bahnhof vier Gleise hat auf den Gleisen und 4 die Züge Zug 1 und Zug stehen und die anderen beiden Gleise frei sind 4

b) Schreiben Sie ein Prädikat einfuegen(zug, GleiseVorher, GleiseNachher), das den Zug Zug auf ein freies Gleis von GleiseVorher stellt, so dass die Gleise anschließend durch GleiseNachher repräsentiert werden. Gehen Sie hierbei davon aus, dass GleiseVorher mindestens ein freies Gleis enthält. Ihr Prädikat sollte für Bahnhöfe mit beliebig vielen Gleisen verwendbar sein. c) Schreiben Sie ein Prädikat bewegen(bahnhof(w, G), bahnhof(wneu, GNeu)), das wartende Züge auf freie Gleise bewegt. Hierbei ist es egal, welches freie Gleis belegt wird. In jedem Schritt soll der Zug bewegt werden, der am längsten wartet. Die Auswertung des Prädikats ist beendet, wenn kein Gleis frei ist oder kein Zug mehr wartet. Sorgen Sie dafür, dass dann in WNeu und GNeu die entsprechend angepassten Werte von W bzw. G stehen. Schreiben Sie hierfür erst ein Hilfsprädikat keinplatz(gleise). Dieses Prädikat ist genau dann wahr, wenn die übergebene Gleisinformation Gleise nirgendwo die frei-markierung enthält. Weiterhin ist es nützlich, das bereits implementierte Prädikat einfuegen zu verwenden. Angewendet auf den obigen Beispiel-Bahnhof B hat der Ergebnis-Bahnhof also ein leeres Wartegleis, die Züge Zug 1 und Zug (nach wie vor) auf den Gleisen und 4 und den ehemals wartenden Zug Zug 3 auf Gleis 1 oder auf Gleis 3 (wobei das andere Gleis weiterhin frei ist). d) Schreiben Sie ein Prädikat neuerzug(zug, bahnhof(w, G), bahnhof(wneu, GNeu)). Hier soll der Zug Zug hinten auf dem Wartegleis eingereiht werden und anschließend so viele wartende Züge wie möglich auf freie Gleise bewegt werden. Implementieren Sie dieses Prädikat mit nur einer einzigen Regel (ohne Fakten) und nutzen Sie die bereits implementierten Prädikate. Sie dürfen ein einfaches zusätzliches Hilfsprädikat implementieren und benutzen, um die Information des Wartegleises anzupassen. % a) % Das Wartegleis wird durch eine Liste repraesentiert, wobei der am % laengsten wartende Zug vorne steht. % bahnhof ([ zug (3)], [frei, zug (1), frei, zug ()]). % b) % Wenn das Gleis an der Stelle frei ist, stelle den Zug dort hin einfuegen (Zug, [ frei XS], [ Zug XS ]). % Wenn das Gleis schon von einem Zug belegt ist, lasse diesen Zug da % stehen und probiere es mit den restlichen Gleisen. einfuegen (Zug, [ zug (X) XS], [ zug (X) ZS ]) :- einfuegen (Zug, XS, ZS ). % c) % Wenn kein Zug wartet, gibt es nichts zu tun bewegen ( bahnhof ([], Gleise ), bahnhof ([], Gleise )). % wenn kein Gleis frei ist, gibt es nichts zu tun bewegen ( bahnhof ([ X XS], Gleise ), bahnhof ([ X XS], Gleise )) :- keinplatz ( Gleise ). bewegen ( bahnhof ([ Zug WartendRest ], Gleise ), bahnhof ( WartendNeu, GleiseNeu )) :- % wir schaffen es, einen wartenden Zug auf ein Gleis zu stellen einfuegen (Zug, Gleise, GleiseTemp ), % wir versuchen es weiter, bis nichts mehr geht bewegen ( bahnhof ( WartendRest, GleiseTemp ), bahnhof ( WartendNeu, GleiseNeu )). keinplatz ([]). keinplatz ([ zug (_) XS ]) :- keinplatz (XS ). % d) neuerzug (Zug, bahnhof ( Wartend, Gleise ), bahnhof ( WartendNeu, GleiseNeu )) :- % wir reihen den Zug in die Warteschlange ein hinteneinfuegen (Zug, Wartend, WartendTemp ), % und bewegen, wenn es passt, wartende Zuege in den Bahnhof bewegen ( bahnhof ( WartendTemp, Gleise ), bahnhof ( WartendNeu, GleiseNeu )). hinteneinfuegen (Zug, [], [ Zug ]). hinteneinfuegen (Zug, [X XS], [X Ergebnis ]) :- hinteneinfuegen (Zug, XS, Ergebnis ). 5

Aufgabe 4 (Programmieren mit Listen in Prolog): ( + 1 + 1 + 1 + 4 + 1 = 10 Punkte) Wir beschäftigen uns in dieser Aufgabe mit den diversen Möglichkeiten, wie man in einem Hochhaus die einzelnen Etagen erreichen kann. Eine der bekannteren Transportmöglichkeiten ist der Aufzug. Weiterhin gibt es Treppen, die verschiedene Etagen miteinander verbinden. Für einige Etagen wurde für Sportbegeisterte auch die Möglichkeit geschaffen, über Kletterwände andere Etagen zu erreichen. a) Übertragen Sie die in der folgenden Grafik aufgeführten Verbindungen in eine Wissensbasis für Prolog. Geben Sie hierzu Fakten für das zweistellige Prädikatsymbol verbindung an. Hierbei gilt verbindung(xs, A), falls die in der Liste XS aufgeführten Etagen mit der Verbindungsmöglichkeit A (also Aufzug, Treppe oder Kletterwand) verbunden sind. Hierbei soll die Liste die in der Grafik aufgeführte Reihenfolge berücksichtigen, so dass untere Etagen weiter vorne in der Liste sind. Beachten Sie auch, dass die mit X markierten Etagen von der jeweiligen Verbindung nicht erreicht werden. X Aufzug Treppe Aufzug X Treppe Kletterwand Geschäftsführung Fitness Elektro Damenmode Cafeteria Büros Erdgeschoss b) Stellen Sie eine Anfrage an das im ersten Aufgabenteil erstellte Programm, mit der man herausfinden kann, welche Verbindungen sich über exakt drei (beliebige) erreichbare Etagen erstrecken. Hinweise: Durch die wiederholte Eingabe von ";" nach der ersten Antwort werden alle Antworten ausgegeben. c) Schreiben Sie ein zweistelliges Prädikat inliste, so dass inliste(xs, X) wahr ist, wenn X in der Liste XS enthalten ist. d) Schreiben Sie mit Hilfe von inliste ein dreistelliges Prädikat weiterhinten. Hierbei soll weiterhinten(xs, A, B) wahr sein, wenn A in der Liste XS vorhanden ist und B in der Liste XS weiter hinten auftaucht als A. Es gilt also beispielsweise weiterhinten([a, c, b, a], a, b), da das einzige b hinter dem ersten a steht. Analog gilt weiterhinten([a, c, b, a], b, c) nicht. Außerdem gilt weiterhinten([b, a, b], a, b) und weiterhinten([b, a, b], b, a). 6

e) Schreiben Sie nun ein dreistelliges Prädikat moeglich, so dass ein Aufruf moeglich(a, B, XS) dann wahr ist, wenn man ausschließlich unter Verwendung der in der Liste XS aufgeführten Transportmöglichkeiten von der Etage A zu der Etage B gelangen kann. Hierbei darf man immer nur nach oben fahren/steigen/klettern, allerdings ist es erlaubt, zwischendurch umzusteigen. Mit der im ersten Aufgabenteil erzeugten Wissensbasis soll also beispielsweise die Anfrage moeglich(erdgeschoss, geschaeftsfuehrung, [treppe, aufzug]) wahr sein, da die folgende Verbindung existiert: 1. erdgeschoss zu damenmode mit Aufzug. damenmode zu elektro mit Treppe 3. elektro zu fitness mit Treppe 4. fitness zu geschaeftsfuehrung mit Aufzug f) Stellen Sie eine Anfrage, mit der man herausfinden kann, welche Etagen man erreichen kann, wenn man in der Etage erdgeschoss startet und ausschließlich Aufzüge und Kletterwände benutzt. % a) verbindung ([ erdgeschoss, bueros, damenmode ], aufzug ). verbindung ([ cafeteria, damenmode, elektro ], treppe ). verbindung ([ fitness, geschaeftsfuehrung ], aufzug ). verbindung ([ cafeteria, elektro, fitness ], treppe ). verbindung ([ erdgeschoss, bueros, cafeteria ], kletterwand ). % b) %?- verbindung ([X, Y, Z], A). % c) inliste ([X _], X). inliste ([_ XS], Y) :- inliste (XS, Y). % d) weiterhinten ([X XS], A, B) :- weiterhinten ([A XS], A, B) :- weiterhinten (XS, A, B). inliste (XS, B). % e) moeglich (X, X, _). moeglich ( START, ENDE, TYPEN ) :- % beliebige Verbindung verbindung ( ETAGEN, TYP ), % mit passendem Typ inliste ( TYPEN, TYP ), % beliebige erreichbare hoehere Etage TEMP weiterhinten ( ETAGEN, START, TEMP ), % Rest der Strecke moeglich ( TEMP, ENDE, TYPEN ). % f) %?- moeglich ( erdgeschoss, X, [ aufzug, kletterwand ]) % X = erdgeschoss ; % X = bueros ; % X = damenmode ; % X = cafeteria ; % X = damenmode ; 7

% X = bueros ; % X = damenmode ; % X = cafeteria ; % X = cafeteria ; Tutoraufgabe 5 (Prolog mit eigenen Datenstrukturen): Natürliche Zahlen lassen sich in Prolog (oder anderen deklarativen Sprachen) durch die Peano-Notation als Terme darstellen. Dabei stellt die Konstante 0 die Zahl 0 dar und für eine Zahl x dargestellt durch den Term X stellt s(x) die Zahl x + 1 dar. So wird z. B. die Zahl 3 durch den Term s(s(s(0))) dargestellt. Binäre Bäume können in Prolog folgendermaßen als Terme dargestellt werden. Sei n eine natürliche Zahl dargestellt durch den Term N. Dann repräsentiert der Term leaf(n) einen Baum mit nur einem Blatt, welches den Wert n enthält. Für zwei Bäume x und y dargestellt durch die Terme X und Y repräsentiert der Term node(x,n,y) einen binären Baum mit einem Wurzelknoten, der den Wert n enthält und die Teilbäume x und y hat. Als Beispiel ist nachfolgend ein binärer Baum und seine Darstellung als Term angegeben. 1 0 1 3 node(leaf(s(0)),s(s(0)),node(leaf(s(0)),0,leaf(s(s(s(0)))))) a) Schreiben Sie ein Prädikat add/3 in Prolog, wobei add(x,y,z) genau dann wahr sein soll, wenn X, Y und Z natürliche Zahlen x, y und z in Peano-Notation repräsentieren und x + y = z gilt. b) Schreiben Sie ein Prädikat leaves/ in Prolog, wobei leaves(x,y) genau dann wahr sein soll, wenn X einen binären Baum x und Y eine natürliche Zahl y in Peano-Notation repräsentieren und x genau y Blätter hat. c) Schreiben Sie ein Prädikat issymmetric/1 in Prolog, wobei issymmetric(x) genau dann wahr sein soll, wenn X einen symmetrischen binären Baum darstellt. Ein binärer Baum ist symmetrisch, wenn er nur aus einem Blatt besteht oder die beiden Teilbäume der Wurzel gespiegelt sind. Z. B. ist der folgende linke binäre Baum symmetrisch, während es der rechte nicht ist. 1 1 1 1 0 3 3 0 3 0 3 0 % isnat ( X) gilt gdw. X eine natuerliche Zahl in Peano - Notation % repraesentiert isnat (0). isnat (s(x)) :- isnat (X). 8

% add (X,Y,Z) gilt gdw. X, Y und Z natuerliche Zahlen in % Peano - Notation repraesentieren und Z die Summe von X und Y ist add (0,Y,Y) :- isnat (Y). add (s(x),y,s(z)) :- add (X,Y,Z). % leaves ( X, Y) gilt gdw. X einen binaeren Baum und Y eine natuerliche % Zahl in Peano - Notation repraesentieren und Y die Anzahl der % Blaetter von X ist leaves ( leaf (_),s (0)). leaves ( node (X,_,Y),Z) :- leaves (X,A), leaves (Y,B), add (A,B,Z). % issymmetric ( X) gilt gdw. X einen symmetrischen binaeren Baum % repraesentiert issymmetric ( leaf (_ )). issymmetric ( node (X,_,Y)) :- mirror (X,Y). % mirror ( X, Y) gilt gdw. X und Y gespiegelte binaere Baeume % repraesentieren mirror ( leaf (X), leaf (X )). mirror ( node (A,B,C), node (D,B,E)) :- mirror (A,E), mirror (C,D). Aufgabe 6 (Prolog mit eigenen Datenstrukturen): ( + 3 + 4 = 9 Punkte) Betrachten Sie erneut die Darstellungen von natürlichen Zahlen und binären Bäumen aus der vorigen Tutoraufgabe. a) Schreiben Sie ein Prädikat maxneighbors/3, wobei maxneighbors(x,y,z) genau dann wahr sein soll, wenn X, Y und Z natürliche Zahlen x, y und z in Peano-Notation darstellen, z das Maximum von x und y ist und sich x und y höchstens um 1 unterscheiden (also Nachbarn oder gleich sind). b) Schreiben Sie ein Prädikat treesum/, wobei treesum(x,y) genau dann wahr sein soll, wenn X einen binären Baum x und Y eine natürliche Zahl y in Peano-Notation darstellen und die Summe der in x enthaltenen natürlichen Zahlen y ist. Hinweise: Das Prädikat add/3 aus der vorigen Tutoraufgabe könnte hilfreich sein. c) Schreiben Sie ein Prädikat isbalanced/1 in Prolog, wobei isbalanced(x) genau dann wahr sein soll, wenn X einen binären Baum darstellt, welcher höhenbalanciert ist. Ein binärer Baum ist höhenbalanciert, wenn sich an jedem seiner Knoten die Höhe der beiden Teilbäume höchstens um 1 unterscheidet. Die Höhe eines binären Baums ist der längste Pfad von der Wurzel bis zu einem Blatt (ein binärer Baum, welcher nur aus einem Blatt besteht, hat also die Höhe 0). Zur Illustration sind nachfolgend zwei binäre Bäume der Höhe 3 abgebildet, wobei der linke höhenbalanciert ist, während der rechte dies nicht ist. 9

1 1 1 1 0 3 3 0 0 3 1 1 Hinweise: Es könnte hilfreich sein, ein Hilfsprädikat isbalancedwithheight/ zu schreiben, welches gleichzeitig zum Test auf Höhenbalanciertheit die Höhe des entsprechenden binären Baums berechnet. Außerdem könnte das Prädikat maxneighbors/3 aus der ersten Teilaufgabe hilfreich sein. % maxneighbors ( X, Y, Z) gilt gdw. X, Y und Z natuerliche Zahlen in % Peano - Notation repraesentieren, Z das Maximum von X und Y ist % und sich X und Y hoechstens um 1 unterscheiden maxneighbors (0,0,0). maxneighbors (0,s(0),s (0)). maxneighbors (s(0),0,s (0)). maxneighbors (s(x),s(y),s(z)) :- maxneighbors (X,Y,Z). % treesum ( X, Y) gilt gdw. X einen binaeren Baum und Y eine % natuerliche Zahl in Peano - Notation repraesentieren und Y die % Summe der Eintraege in X ist treesum ( leaf (X),X) :- add (0,X,X). treesum ( node (X,Y,Z),N) :- treesum (X,A), treesum (Z,B), add (A,B,C), add (C,Y,N). % isbalanced ( X) gilt gdw. X einen hoehenbalancierten binaeren Baum % repraesentiert ( dies ist der Fall, wenn X einen % hoehenbalancierten binaeren Baum mit einer beliebigen Hoehe % repraesentiert ) isbalanced (X) :- isbalancedwithheight (X,_). % isbalancedwithheight ( X, Y) gilt gdw. X einen hoehenbalancierten % binaeren Baum und Y eine natuerliche Zahl in Peano - Notation % repraesentieren und Y die Hoehe von X ist isbalancedwithheight ( leaf (_ ),0). isbalancedwithheight ( node (X,_,Y),s(Z)) :- isbalancedwithheight (X,A), isbalancedwithheight (Y,B), % wenn beide Teilbaeume % hoehenbalanciert sind, % duerfen deren Hoehen % sich hoechstens um 1 % unterscheiden und die 10

% Hoehe des gesamten Baums % ist ihr Maxmimum plus 1 maxneighbors (A,B,Z). 11