Tutoraufgabe 1 (Programmieren in Prolog):

Ähnliche Dokumente
Aufgabe 2 (Unendliche Listen in Haskell):

Tutoraufgabe 1 (Programmieren in Prolog):

Tutoraufgabe 1 (Programmieren in Prolog):

Tutoraufgabe 1 (Datenstrukturen in Haskell):

Tutoraufgabe 1 (Datenstrukturen in Haskell):

Einführung in die Informatik 2 9. Übung

Tutoraufgabe 1 (Auswertungsstrategie):

10. Hausübung Algorithmen und Datenstrukturen

Aufgabe 1 (Programmanalyse):

Tutoraufgabe 1 (Listen):

Natürliche Bäume. (Algorithmen und Datenstrukturen I) Prof. Dr. Oliver Braun. Letzte Änderung: :16. Natürliche Bäume 1/16

2. Klausur Programmierung WS 2014/2015

Klausur Programmierung WS 2012/2013

Tutoraufgabe 1 (Auswertungsstrategie):

Algorithmen und Datenstrukturen

Kapitel 12: Induktive

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

Klausur Programmierung WS 2017/2018

Einfache binäre Suchbäume können entarten, so dass sich die Tiefen ihrer Blattknoten stark unterscheiden

Anzahl Punkte Erreichte Punkte Aufgabe 1 10 Aufgabe 2 14 Aufgabe 3 16 Aufgabe 4 26 Aufgabe 5 15 Aufgabe 6 19 Summe 100

Binäre Bäume Darstellung und Traversierung

Motivation Binäre Suchbäume

Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B4.1 Definitionen und Eigenschaften. B4.2 Traversierung. B4.

Datenstrukturen & Algorithmen Lösungen zu Blatt 4 FS 15

Stud.-Nummer: Datenstrukturen & Algorithmen Seite 1

Software Entwicklung 1

Programmierung WS18/19 Übungsblatt 9 (Abgabe Freitag, den um 12 Uhr)

2.4 Durchlaufen von Bäumen

Übung 3 Musterlösung

Übungen zu Programmierung I - Blatt 8

Algorithmen und Datenstrukturen. Bäume. M. Herpers, Y. Jung, P. Klingebiel

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 15 (Linearer Speicher, Listen, Bäume)

Wiederholung. Datenstrukturen und. Bäume. Wiederholung. Suchen in linearen Feldern VO

travel(valmont,paris,go(valmont,metz,go(metz,paris))) die Antwort yes ausgeben. Fragt man dein Programm nach

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

Lineare Liste. struct list_element { float f; /* weitere Elemente */ struct list_element *next; /* Zeiger auf Nachfolger-Element */ }; Peter Sobe

(a, b)-bäume / 1. Datenmenge ist so groß, dass sie auf der Festplatte abgespeichert werden muss.

Trees. November 14, Algorithms & Datastructures 2 Exercises WT 2017

ADS: Algorithmen und Datenstrukturen

Tutoraufgabe 1 (Hoare-Kalkül):

Tutoraufgabe 1 (2 3 4 Bäume):

Algorithmen und Datenstrukturen 1

Trees. November 13, Algorithms & Datastructures 2 Exercises WT 2017

13. Bäume: effektives Suchen und Sortieren

13. Bäume: effektives Suchen und Sortieren

Übung Algorithmen und Datenstrukturen

Datenstrukturen. einfach verkettete Liste

Übung Informatik I - Programmierung - Blatt 8

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Übersicht: Graphen. Definition: Ungerichteter Graph. Definition: Ungerichteter Graph

Datenstrukturen und Algorithmen SS07

Tutoraufgabe 1 (Casting): Programmierung WS17/18 Übungsblatt 2 (Abgabe ) Allgemeine Hinweise:

Algorithmen und Datenstrukturen 1

type Subtrees is array (Natural range < >) of Kptr; type Ktree (Arity: Natural) is record content : SomeType; children : Subtrees (1..

Logische Programmierung & Deduktive Datenbanken Klausur

Klausur Programmierung WS 2011/2012

Tutoraufgabe 1 (Suchen in Graphen):

Algorithmen und Datenstrukturen

Aufgabe 1 (Programmanalyse):

Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B3.1 Einführung. B3.2 Verkettete Liste. B3.3 Bäume

13. Binäre Suchbäume

Algorithmen und Datenstrukturen

Ordnungsrelationen auf Mengen. Beispiel einer Ordnungsrelation. Spezielle Elemente von Ordnungen. Spezielle Elemente von Ordnungen

Ordnungsrelationen auf Mengen

Pro Informatik 2009: Objektorientierte Programmierung Tag 18. Marco Block-Berlitz, Miao Wang Freie Universität Berlin, Institut für Informatik

Aufgabe 1 Basiswissen zur Vorlesung (8 Punkte)

Rekursive Listenverarbeitung

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

Bäume und der Sequence ADT

Datenstrukturen und Algorithmen SS17 Lösung - Übung 5

Einführung in die funktionale Programmierung

Prüfung Informatik D-MATH/D-PHYS :00 17:00

Tutoraufgabe 1 (Klassenhierarchie):

Klausur zur Vorlesung Algorithmen und Datenstrukturen

Einführung in die Informatik 2

Tutoraufgabe 1 (2 3 4 Bäume):

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

Datenstrukturen (SoSe 12) Klausur (Modulabschlussprüfung)

Übungsblatt zu Teil 2 (Einführung und Grundkonzepte)

Elementare Datenstrukturen

Teil 4: Rekursion und Listen

Programmieren in Haskell Programmiermethodik

Ordnungsrelationen auf Mengen

Gliederung. Programmierparadigmen. Einführung in Prolog: Einführung in Prolog: Programmieren in Prolog. Einführung Syntax Regeln Listen Relationen

Algorithmen und Datenstrukturen

Liste: beliebig lange, geordnete Sequenz von Termen. Kopf ist erstes Listenelement, Schwanz die restliche Liste

Datenstrukturen und Algorithmen (SS 2013) Prof. Dr. Leif Kobbelt Thomas Ströder, Fabian Emmes, Sven Middelberg, Michael Kremer

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

Tutoraufgabe 1 (Datenstrukturen in Haskell):

Kap. 4.2: Binäre Suchbäume

18. Natürliche Suchbäume

Algorithmen und Datenstrukturen

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

Übung: Algorithmen und Datenstrukturen SS 2007

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

Teil 1: Suchen. Ausgeglichene Bäume B-Bäume Digitale Suchbäume. M.O.Franz, Oktober 2007 Algorithmen und Datenstrukturen - Binärbäume 1-1

Algorithmen und Datenstrukturen VO 3.0 Vorlesungsprüfung 19. Oktober 2007

Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6

Abgabe: (vor der Vorlesung) Aufgabe 7.1 (P) Binomial Heap

Algorithmen und Datenstrukturen 1 VL Übungstest WS Jänner 2009

Aufgabe 2 (Collections):

Transkript:

Prof. aa Dr. J. Giesl S. Dollase, M. Hark, D. Korzeniewski 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 J. Hensel (jhe) Assistent M. Hark (mha) Assistent D. Korzeniewski (dko) Assistent L. Bernwald (lbe) Tutor S. Azari (saz) 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 herausnden 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(jhe,lbe) wahr, während bossvon(dko,fai) und bossvon(lbe,jhe) beide falsch sind. d) Stellen Sie eine Anfrage, mit der Sie alle Personen herausnden, die in der Übungsbetriebshierarchie direkte Untergebene haben. Dabei sind mehrfache Antworten mit dem gleichen Ergebnis erlaubt. e) Schreiben Sie schlieÿlich ein Prädikat vorgesetzt mit zwei Regeln, 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(jgi, fai) und vorgesetzt(dko, fai) beide wahr, während vorgesetzt(lbe, jhe) falsch ist. person ( jgi ). person ( jhe ). person ( mha ). person ( dko ). person ( lbe ). person ( saz ). person ( fai ). person ( ner ). 1

person ( mus ). hatrang ( jgi, professor ). hatrang ( jhe, assistent ). hatrang ( mha, assistent ). hatrang ( dko, assistent ). hatrang ( lbe, tutor ). hatrang ( saz, tutor ). hatrang ( fai, student ). hatrang ( ner, student ). hatrang ( mus, student ). %?- hatrang (X, assistent ). % X = jhe ; % X = mha ; % X = dko. 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, _ ). % X = jgi ; % X = jgi ; % X = jgi ; % X = jhe ; % X = jhe ; % X = mha ; % X = mha ; % X = dko ; % X = dko ; % X = lbe ; % X = lbe ; % X = lbe ; % X = saz ; % X = saz ; % X = saz ; % false. % Teilaufgabe e) vorgesetzt (B, S) :- bossvon (B, S ). vorgesetzt (B, S) :- bossvon (B, X), vorgesetzt (X, S ). Aufgabe 2 (Programmieren in Prolog): (1 + 0.5 + 1 + 0.5 + 2 = 5 Punkte) In dieser Aufgabe soll ein Bewertungssystem in Prolog modelliert und analysiert werden. Jede Unterkunft kann mit 1 bis 5 Sternen bewertet werden. 2

Unterkunft Waldhotel (wh) Berghotel (bh) Hotel am See (sh) Pilgerhotel (ph) Jugendherberge (jh) Bett bei Freunden (fb) Bewertung 4 Sterne 5 Sterne 2 Sterne 1 Sterne 3 Sterne 5 Sterne Schreiben Sie keine Prädikate auÿer den geforderten und nutzen Sie bei Ihrer Implementierung jeweils Prädikate aus den vorangegangenen Aufgabenteilen. Benutzen Sie keine vordenierten Prädikate. Achten Sie auf die korrekte Schreibweise der Namen aus der Aufgabenstellung. a) Übertragen Sie die oben gegebenen Informationen in eine Wissensbasis für Prolog. Geben Sie hierzu Fakten und/oder Regeln für die Prädikatssymbole istunterkunft, hateinenstern, hatzweisterne, hatdreisterne, hatviersterne und hatfuenfsterne an. Hierbei gilt istunterkunft(x), falls X eine Unterkunft ist, hateinenstern(x), falls X eine mit einem Stern bewertete Unterkunft ist, hatzweisterne(x), falls X eine mit zwei Sternen bewertete Unterkunft ist, usw. b) Geben Sie eine Anfrage an das im ersten Aufgabenteil erstellte Programm an, mit der man herausnden kann, welche Unterkünfte mit fünf Sternen bewertet worden sind. Hinweise: Durch die wiederholte Eingabe von ; nach der ersten Antwort werden alle Antworten ausgegeben. c) Schreiben Sie ein Prädikat hateinensternweniger, womit Sie abfragen können, ob eine Unterkunft mit genau einem Stern weniger bewertet wurde als eine zweite Unterkunft. So ist beispielsweise hateinensternweniger(wh, fb) wahr, während hateinensternweniger(sh, bh) und hateinensternweniger(jh, sh) beide falsch sind. d) Stellen Sie eine Anfrage, mit der Sie alle Unterkünfte herausnden, die so bewertet wurden, dass es mindestens eine weitere Unterkunft gibt, welche mit genau einem Stern weniger bewertet worden ist. Dabei sind mehrfache Antworten mit dem gleichen Ergebnis erlaubt. e) Schreiben Sie ein Prädikat hatwenigersterne, mit welchem Sie alle Paare von Unterkünften abfragen können, sodass die erste Unterkunft schlechter bewertet worden ist als die zweite Unterkunft. So ist z.b. hatwenigersterne(ph, bh) wahr, während hatwenigersterne(bh, fb) und hatwenigersterne(jh, ph) beide falsch sind. istunterkunft ( wh ). istunterkunft ( bh ). istunterkunft ( sh ). istunterkunft ( ph ). istunterkunft ( jh ). istunterkunft ( fb ). hateinenstern ( ph ). hatzweisterne ( sh ). hatdreisterne ( jh ). hatviersterne ( wh ). hatfuenfsterne ( bh ). hatfuenfsterne ( fb ). %?- hatfuenfsterne (X ). 3

% X = bh ; % X = fb. hateinensternweniger (X, Y) :- hateinenstern (X), hatzweisterne (Y ). hateinensternweniger (X, Y) :- hatzweisterne (X), hatdreisterne (Y ). hateinensternweniger (X, Y) :- hatdreisterne (X), hatviersterne (Y ). hateinensternweniger (X, Y) :- hatviersterne (X), hatfuenfsterne (Y ). % Teilaufgabe d) %?- hateinensternweniger (_, Y ). % Y = sh ; % Y = jh ; % Y = wh ; % Y = bh ; % Y = fb. % Teilaufgabe e) hatwenigersterne (X, Y) :- hateinensternweniger (X, Y ). hatwenigersterne (X, Y) :- hateinensternweniger (X, Z), hatwenigersterne (Z, Y ). Tutoraufgabe 3 (Prolog mit Listen und 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 n dargestellt durch den Term N stellt s(n) die Zahl n + 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. 2 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 increment/2 in Prolog, wobei increment(b,incb) genau dann wahr sein soll, wenn sich der Baum IncB aus dem Baum B ergibt, indem jede Zahl, die in einem Knoten oder Blatt steht, um eins erhöht wird. Beispielsweise soll der Aufruf increment(node(leaf(s(0)),s(s(0)),leaf(0)),res) das Ergebnis Res = node(leaf(s(s(0))),s(s(s(0))),leaf(s(0))) liefern. b) Schreiben Sie ein Prädikat append(xs,ys,res), das die Listen XS und YS hintereinanderhängt. Ein Aufruf von append([a,b,c],[d,e],res) würde das Ergebnis Res = [a,b,c,d,e] liefern. 4

c) Es gibt verschiedene Verfahren, um einen Baum systematisch zu durchsuchen. Man unterscheidet zwischen Pre-, In- und Postorder-Traversierung. Bei einer Preorder-Traversierung wird zuerst die Wurzel (W) eines Baums durchsucht, dann der linke Teilbaum (L) und anschlieÿend der rechte Teilbaum (R). Bei Inorder ist die Reihenfolge LWR und bei Postorder LRW. Für den Beispielbaum aus der Abbildung ergeben sich folgende Ausgaben: Preorder: 2, 1, 0, 1, 3 Postorder: 1, 1, 3, 0, 2 Inorder: 1, 2, 1, 0, 3 Sie sollen nun eine Funktion inorder(b,res) schreiben, die alle Knoten eines Baumes in Inorder- Reihenfolge in die Liste Res einträgt. Wenn B der Baum aus der Abbildung ist, so würde inorder(b,res) das Ergebnis Res = [s(0),s(s(0)),s(0),0,s(s(s(0)))] liefern. Hinweise: Sie dürfen die Funktion append aus Teilaufgabe b) verwenden. increment ( leaf (X), leaf (s(x ))). increment ( node (L, N, R), node ( IncL, s(n), IncR )) :- increment (L, IncL ), increment (R, IncR ). append ([], YS, YS ). append ([ X XS ], YS, [X Res ]) :- append (XS, YS, Res ). inorder ( leaf (X ),[ X ]). inorder ( node (L, N, R), Res ) :- inorder (L, ResL ), inorder (R, ResR ), append ( ResL, [N ResR ], Res ). Aufgabe 4 (Prolog mit Listen und eigenen Datenstrukturen): (1.5 + 1.5 + 3.5 + 1.5 + 2.5 = 10.5 Punkte) Verwenden Sie in dieser Aufgabe keine vordenierten Prädikate. Nutzen Sie Prädikate, deren Implementierung in früheren Teilaufgaben gefordert wurde, falls dies sinnvoll ist. a) Eine Möglichkeit, Listen in Prolog darzustellen, ist die Verwendung eines nullstelligen Funktionssymbols nil zur Repräsentation der leeren Liste und eines zweistelligen Funktionssymbols cons zur Repräsentation nicht-leerer Listen, wobei das erste Argument von cons der in dem aktuellen Listenelement gespeicherte Wert und das zweite Argument von cons die Restliste ist. Auf diese Art und Weise kann z.b. die Liste [1,2,3] durch den Term cons(1, cons(2, cons(3, nil))) dargestellt werden. Implementieren Sie ein Prädikat islist(x) das genau dann wahr ist, wenn X eine mit Hilfe der Funktionssymbole nil und cons beschriebene Liste ist. Beispielsweise sollte islist(cons(a, cons(b, nil))) wahr sein, aber islist(cons(nil, 1)) ist falsch. b) Implementieren Sie ein Prädikat toprologlist(x,y) das genau dann wahr ist, wenn X eine mit Hilfe der Funktionssymbole nil und cons (siehe vorheriger Aufgabenteil) beschriebene Liste ist und 5

Y die gleiche Liste wie X beschreibt, dazu jedoch die vordenierten Prolog-Listen nutzt. Es soll also beispielsweise toprologlist(cons(1, cons(2, cons(3, nil))), [1,2,3]) gelten. c) Implementieren Sie mit den vordenierten Listen in Prolog ein Prädikat flatten(x,y) das genau dann wahr ist, wenn X eine Liste von Listen ist und Y jene Liste ist, die entsteht, wenn man alle Element von X konkateniert. Es soll also beispielsweise flatten([[1,2,3],[],[3,4]], [1,2,3,3,4]) gelten. d) Implementieren Sie ein Prädikat appendelement(x,y,z), das genau dann wahr ist, wenn die Liste Z entsteht, wenn man an die Liste X das Element Y hinten anhängt. Verwenden Sie zum Lösen dieser Aufgabe die vordenierten Prolog-Listen. Es soll also beispielsweise appendelement([1,2], 3, [1,2,3]) gelten. e) Implementieren Sie ein Prädikat reverselist(x,y), das genau dann wahr ist, wenn die Liste Z entsteht, wenn man die Liste X umkehrt. Verwenden Sie zum Lösen dieser Aufgabe wieder die vordenierten Prolog-Listen. Es soll also beispielsweise reverselist([1,2,3,4], [4,3,2,1]) gelten. islist ( nil ). islist ( cons (_, XS )) :- islist ( XS ). toprologlist ( nil, []). toprologlist ( cons (X, XS ), [X YS ]) :- toprologlist (XS, YS ). flatten ([], []). flatten ([[] XS ], YS ) :- flatten (XS, YS ). flatten ([[ X XS ] XSS ], [X YS ]) :- flatten ([ XS XSS ], YS ). % Teilaufgabe d) appendelement ([], Y, [Y ]). appendelement ([ X XS ], Y, [X YS ]) : - appendelement (XS, Y, YS ). % Teilaufgabe e) reverselist ([], []). reverselist ([ X], [X ]). reverselist ([ X XS ], REV ) :- reverselist (XS, YS ), appendelement (YS, X, REV ). 6