Sie sind auf Seite 1von 3
Institut für Programmstrukturen und Datenorganisation Prof. Dr.-Ing. Gregor Snelting gregor.snelting@kit.edu Prof. Dr.

Institut für Programmstrukturen und Datenorganisation

Prof. Dr.-Ing. Gregor Snelting

gregor.snelting@kit.edu

Prof. Dr. Ralf Reussner

reussner@kit.edu

Programmierparadigmen – WS 2011/12

http://pp.info.uni-karlsruhe.de/lehre/WS201112/paradigmen/uebung

Blatt 8: Ausführungsbäume, Nummern

Abgabe:

Besprechung: 19.12. – 20.12.2011

15.12.2011, 11:30h

Geben Sie Ihre Programme und Lösungen auf Papier bis zum 15.12.2011 um 11:30h im Briefkasten „Programmierparadigmen“ (Geb. 50.34, UG) ab. Beschriften Sie Ihre Abgabe mit Ihrem Namen und Ihrer Übungsgruppennummer rechts oben. Schicken Sie zusätzlich Ihre Programme per E-Mail an Ihren Übungsleiter. Dessen E-Mail-Adresse finden Sie auf der Lehrstuhlhomepage.

1 Tester, Generatoren, Ausführungsbäume

In der Vorlesung wurden Prädikate odd(X) und even(X) vorgestellt. Diese testen ob X gerade ist, bzw. ob X ungerade ist. So wird die Anfrage ?even(4) erfüllt, ?odd(4) hingegen nicht.

even(0).

even(X)

:-

X>0,

X1

is

X-1,

odd(X1).

odd(1).

odd(X)

:-

X>1,

X1

is

X-1,

even(X1).

Listing 1: Tester

Die folgende Variante ist geeignet zum Generieren aller geraden bzw. aller ungeraden Zahlen. Bei- spielsweise gibt die Anfrage ?even(X) bei wiederholter Neuerfüllung alle geraden Zahlen aus.

even(0).

even(X)

:-

odd(Y),

X

is

Y+1,

X>0.

odd(1).

odd(X)

:-

even(Y),

X

is

Y+1,

X>1.

Listing 2: Generatoren

1. Warum ist keine der beiden Varianten sowohl als Tester als auch als Generator anwendbar?

2. Was passiert, wenn bei den Generatoren die Teilziele X>0 und X>1 weggelassen werden?

3. Im Folgenden sind für die Anfrage ?even(X) die Ausführungsbäume zum Zeitpunkt der Aus- gabe von X=0 bzw. X=2 dargestellt.

Zeichnen die den Ausführungsbaum zum Zeitpunkt der Ausgabe von X=4. Welches Teilziel schlägt dabei einmal fehl?

even 1 (X 1 ) X 1 = 0 X 1 = 0 → even
even 1 (X 1 )
X 1 = 0
X 1 = 0
→ even 2
;
even 2 (X 1 )
X 1 = X 2
odd 1 (Y 2 )
X 2 is Y 2 + 1
X 2 > 0
X 1 = 2
Y 2 = 1
X 2 = 2
→ odd 2
;

2

Natürliche Zahlen

Wie bereits von den Church-Zahlen bekannt, lassen sich die natürlichen Zahlen durch verschachtelte Strukturen kodieren. Prolog erlaubt das einfache Definieren von Termen, was eine Schachtelung einfach macht. Gegeben seien die folgenden Prädikate zur Umwandlung von Integern in unärer Schachteldar- stellung und zur Prüfung auf Null bzw. Eins.

from_int(0,0).

from_int(X,s(Y))

:-

Xn

is

X-1,

from_int(Xn,Y),!.

zero(0).

one(s(0)).

Beispielsweise ergibt sich die 4 so als s(s(s(s(0)))).

1. Schreiben Sie ein zweistelliges Prädikat succ, welches die nachfolgende Zahl bestimmt. Achten Sie darauf, dass Ihr Prädikat rückwärts ausführbar ist, so dass man damit auch die vorhergehende Zahl bestimmen kann. Beispiel:

|

?-

succ(s(s(0)),X).

X

=

s(s(s(0)))

|

?-

succ(X,s(s(0))).

X

=

s(0)

2. Schreiben Sie einstellige Prädikate odd und even, welche sowohl zum Testen als auch zum Generieren von Zahlen in solcher Kodierung geeignet ist.

3. Auf succ aufbauend lassen sich nun Prädikate für Addition, Multiplikation, Potenz und Fakultät erstellen. Wenn Sie alles korrekt machen, lassen sich ihre Prädikate auch rückwärts ausführen, so dass eine kurzes Copy&Paste enthüllt, ob es eine natürliche Zahl x gibt, für die gilt:

x! = s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s( s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s( s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(

s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0)

))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

4. Zusätzlich zum Rechnen mit diesen Zahlen, möchte man diese auch oft vergleichen. Implemen-

tieren Sie Prädikate für die Vergleichsoperationen <, >, =, =,

Hinweis: Der Cut könnte hilfreich sein.

und .