Lehrstuhl für Softwaretechnik und Programmiersprachen Professor Dr. Michael Leuschel Einführung in die logische Programmierung - WS 2012/2013 Übungsblatt 1 Bei Fragen bezüglich der Übungen melden Sie sich bitte bei Sven Hager ([email protected]) Information Auf der Webseite der Veranstaltung können Sie sich Testfälle für die untenstehenden Aufgaben herunterladen. Aufgabe 1 - Arithmetik ”He who refuses to do arithmetic is doomed to talk nonsense.” - John McCarthy, inventor of LISP In dieser Aufgabe soll es darum gehen, sich mit Hilfe von Prolog eine grundlegende Arithmetik auf natürlichen Zahlen zu definieren. Betrachten Sie die folgende Definition der natürlichen Zahlen in Listing 1. 1 2 3 nat (0). nat ( s ( X )) : nat ( X ). Listing 1: Natürliche Zahlen in Prolog a) Beweisen Sie mit vollständiger Induktion, dass sich jede Zahl n ∈ N mit obigem Prolog-Prädikat darstellen lässt. b) Definieren Sie nun auf Basis dieser Darstellung die folgenden Prolog-Prädikate: 1. make nat(Zahl, PrologZahl), ein Hilfsprädikat, um natürliche Zahlen in obige Form zu bringen 2. add(Summand1, Summand2, Summe), welches zwei natürliche Zahlen addiert 3. sub(Minuend, Subtrahend, Differenz), welches zwei natürliche Zahlen subtrahiert. Falls der Subtrahend größer als der Minuend ist, soll 0 berechnet werden. 4. mul(Faktor1, Faktor2, Produkt), welches zwei natürliche Zahlen multipliziert 5. pow(B, E, R), welches die Rechnung B E = R implementiert 6. fact(Number, Factorial), welches die Fakultät N ! einer natürlichen Zahl N berechnet 1 7. lt(N1, N2), welches N 1 < N 2 implementiert 8. mod(A, B, C), welches die Modulo-Operation A mod B = C implementiert c) Auf N gilt die Gleichung b ab = (a 2 )2 falls 2|b gilt. Schreiben Sie ein Prädikat pow2, welches diese Tatsache ausnutzt. Aufgabe 2 - Einfaches Arbeiten mit Listen ”As the bread and butter of functional programming, lists deserve some serious attention.” - Real World Haskell Da obiges Zitat ebenso für Prolog gilt, implementieren Sie die folgenden Listenoperationen: 1. is a list(L), testet, ob L eine Prolog-Liste ist 2. app(L1, L2, L3), konkateniert L1 und L2 zu L3 3. infix(I, L), testet, ob I ein Infix der Liste L ist 4. suffix(S, L), testet, ob S ein Suffix der Liste L ist 5. prefix(P, L), testet, ob P ein Präfix der Liste L ist 6. element of(E, L), testet, ob E ein Element der Liste L ist 7. del element(E, L, R), löscht E aus der Liste L und gibt die neue Liste R zurück Aufgabe 3 - Traversieren von Bäumen Abbildung 1 skizziert eine mögliche Modellierung von n-ären Bäumen in Prolog. Figure 1: Prolog-Darstellung von Bäumen a) Implementieren Sie ein Prädikat is tree(T), welches testet, ob T ein n-ärer Baum in obiger Darstellung ist. b) Implementieren Sie die Prädikate t2l pre(T, L) und t2l post(T, L), welche den Baum T in Pre- und Postorder-Reihenfolge traversieren und die Knoten entsprechend in eine Liste L schreiben. 2 c) Schreiben Sie ein Prädikat height(T, H), welches die Höhe eines n-ären Baumes in obiger Darstellung berechnet. Aufgabe 4 - ground Implementieren Sie das Prädikat my ground(Term) mithilfe der Builtin-Prädikate =.. und nonvar. 3