Übungsblatt 2 - Softwaretechnik und Programmiersprachen

Werbung
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
Herunterladen