Deklarative Programmierung

Übungszettel 08 - Jonathan Wendt


originaler Übungszettel

Racket-File

Aufgabe 06

Aufgabenbeschreibung:

Das Nim-2-3-Spiel1 ist ein Spiel für 2 Personen. Zu Beginn werden Streichhölzer in 2 Reihen ausgelegt, wobei die Anzahl der Streichhölzer in den einzelnen Reihen beliebig gewählt werden kann. Die Spieler ziehen nun abwechselnd. Wer am Zug ist, entnimmt aus der Reihe, die mehr Streichhölzer enthält, 2 oder 3 Streichhölzer. Wenn beide Reihen gleich viele Streichhölzer enthalten, kann eine beliebige Reihe wählen. Wer zuerst nicht mehr ziehen kann, hat das Spiel verloren.

Aufgabe 06 (a)

Aufgabenbeschreibung

Schreiben Sie eine Funktion:

Lösung

Aufgabe 06 (b)

Aufgabenbeschreibung

Zeigen Sie, dass Ihre (win? n m)-Implementierung terminiert.

Lösung

Der erste Aufruf von win? erfolgt mit beliebigen n und m. Sofern die Abbruchbedingung (n<2)(m<2) erfüllt ist, erfolgt kein weiterer rekursiver Aufruf und die Funktion terminiert. Ist die Bedingung nicht erfüllt, so erfolgt...

... ein erneuter Aufruf von win?, während der jeweils andere Wert unverändert bleibt.

In jedem erneuten Aufruf gilt also in jedem Fall entweder n1<n0 oder m1<m0, womit beide Parameter mit jeder Rekursionsstufe gegen ihre Abbruchbedingung streben.

Aufgabe 06 (c)

Aufgabenbeschreibung

Schreiben Sie eine Funktion:

(suggest m n) soll dabei dem Spieler den nächsten Zug empfehlen, sodass dieser gewinnt. Greifen Sie dabei auf ihre (win? n m)-Funktion zurück. Ist es nicht möglich für den Spieler zu gewinnen, soll ein Text mit dieser Information zurückgegeben werden.

Lösung