BuK-Übung02 G2
Aus ProgrammingWiki

Inhaltsverzeichnis |
Halteproblem
Aufgabe
Spielen Sie die Betrachtungen zum Halteproblem mit Scheme-Prozeduren nach. Hinweis: Definieren Sie ggf. auch eine Prozedur haelt-tricky?, die #t zurück gibt, wenn das betrachtete Programm P ein Ergebnis berechnet, und #f, wenn die Berech- nung in einer gewissen Zeit T zu keinem Ergebnis führt. Verwenden Sie zeitbeschränkte Berechnungen, deren Implementierungsidee einige Kreativität erfordert.
Lösung für Racket
Die Lösungsidee besteht darin, einen neuen Thread für sie zu prüfende Prozedur zu starten. Der Hauptthread fragt anschließend periodisch ab, ob der andere Thread seine Berechnung beendet hat. Ist die Berechnung nach einer bestimmten Zeit nicht abgeschlossen, wird die Berechnung gestoppt und #f zurückgegegen. In der Praxis ist diese Lösungsvariante mit Threads und einem Timeout häufig anzutreffen.
Aufrufbeispiele:
Eine ähnliche Implementation in Java kann hier gefunden werden.
Beweise
Aufgabe 1
Zeigen Sie, dass die Menge der rationalen Zahlen abzählbar unendlich ist.
Lösung
Eine Menge ist dann abzählbar unendlich wenn sie gleichmächtig zur Menge der natürlichen Zahlen ist. Mit Cantors erstes Diagonalargument lässt sich zeigen, dass die unendliche Menge der rationalen Zahlen
gleichmächtig mit der Menge der natürlichen Zahlen
ist.
Aufgabe 2
Zeigen Sie, dass die Wortmenge über
abzählbar unendlich ist.
Lösung
Gegeben sei ein Alphabet mit den Elementen
im weiteren Buchstaben genannt. Die Anzahl der Buchstaben ist
und endlich. Weiterhin sei die Ordnungsrelation
für die Buchstaben gegeben.
Die Wortmenge wird gebildet, in dem beliebige Buchstaben aus
verkettet werden. Die Länge eines Wortes wird über die Anzahl der Buchstaben festgelegt.
Beispiel: hat die Länge 1,
hat die Länge 3 und als Spezialfall für das leere Wort
mit der Länge 0.
Die Abbildung der Wörter aus auf die natürlichen Zahlen
wird wie folgt umgesetzt. Die Wörter werden ihrer Länge entsprechend angeordnet, wobei die kürzeren (Länge ist kleiner) zuerst verwendet werden. Wörter der selben Länge werden lexikographisch geordnet. Das erste Wort wird der 1 zugeordnet, das Zweite der 2 usw..
Angewendet ergibt sich:
Jedem Element der Wortmenge kann genau eine natürliche Zahl zugeornet werden. Die Wortmenge über
ist also abzählbar unendlich.
Aufgabe 3
Zeigen Sie, dass die Menge der reellen Zahlen überabzählbar unendlich ist.
Lösung
Durch Widerspruch kann gezeigt werden, dass die Menge der reellen Zahlen überabzählbar unendlich ist. Für den Beweis wird das offene Intervall (0,1) betrachtet was eine echte Teilmenge der reellen Zahlen darstellt.
Annahme: Die Menge der reellen Zahlen im offenen Intervall (0,1) ist abzählbar.
Es muss eine bijektive Abbildung der reellen Zahlen auf die natürlichen Zahlen existieren. Sei nun eine beliebige Folge von reellen Zahlen im offenen Intervall (0,1). Die Folge lässt sich dezimal wie folgt darstellen:
wobei reelle Zahlen sind und
die Dezimalstellen dieser Zahlen. Nun lässt sich eine Zahl
konstruieren die nicht in der Folge
zu finden ist.
wobei
Diese Diagonalzahl unterscheidet sich von allen anderen Zahlen der Folge
und ist ebenfalls im Intervall (0,1). Es kann also für jede beliebige Folge
eine Zahl gefunden werden die nicht in der Folge enthalten ist.
Es existiert keine surjektive Abbildung der natürlichen Zahlen auf das offene Intervall (0,1). D.h. es kann auch keine bijektive Abbildung existieren. Die Menge der reellen Zahlen im Intervall (0,1) ist also nicht abzählbar. Sie ist überabzählbar unendlich. Da das Intervall eine echte Teilmenge der reellen Zahlen ist, gilt das auch für die Menge der reellen Zahlen.
Kreativität
Schauen Sie sich das Video an, um den Begriff der Kreativität besser zu verstehen.
Bijektive Funktion
Aufgabe
Verifizieren Sie, dass die folgende Funktion eine bijektive Funktion ist und
implementieren Sie eine Prozedur, die die zugehörige Umkehrfunktion
berechnet.
Lösung
Scheme Prozedur
Handrechnung
Beweis
Es existiert eine Funktion , die die Umkehrfunktion von
darstellt.
Dann muss gelten:
(1):
D.h. aber auch, dass alle Zahlen aus auf genau eine Zahl aus
abgebildet werden. Die Abbildung durch die Funktion
ist injektiv. Würde das nicht gelten wäre die Gleichung (1) nicht erfüllt.
Die Abbildung der Funktionswerte von auf
ist ebenfalls injektiv. Das reicht aber noch nicht um die Bijektivität der Funktion
zu beweisen. Dazu muss gelten:
(2):
Aus Gleichung (2) ist zu entnehmen, dass wirklich alle Werte (nicht nur die Funktionswerte aus ) aus
auf
abgebildet werden.
Gegeben ist die Umkehrfunktion:
Beweis Gleichung (1)
: trivial
gerade :
ungerade :
Damit ist für alle gezeigt, das die Gleichung erfüllt ist.
Beweis Gleichung (2)
: trivial
:
:
Für alle ist somit gezeigt, dass die Gleichung (2) erfüllt ist.
Da jetzt bewiesen ist, dass die Gleichung (1) und (2) mit der gegebenen Umkehrfunktion gelten handelt es sich bei der Funktion
um eine bijektive Funktion. Jeder Zahl aus
kann genau eine Zahl aus
zugeordnet werden und umgekehrt.
Prozedur für die Umkehrfunkion
Die folgende Funktion berechnet die Umkehrfunktion für gültige Eingaben in C#. Die Klasse Fraction stellt die rationale Zahlen dar.
Func<Fraction, int> reverse = null; reverse = x => (x == Fraction.One) ? 1 : (x > Fraction.One) ? reverse (x - 1) * 2 : reverse (Fraction.Inverse (x)) + 1;