### Merge branch 'master' into 'master'

Master

See merge request !1
parents bcb84193 3047fa72
 /info4/kapitel-*/.ipynb_checkpoints /info4/kapitel-*/exports /info4/kapitel-*/*/__pycache__/
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
 { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Das (spezielle) Halteproblem\n", "\n", "Im Skript wird das Halteproblem formal definiert. Hier wollen wir das Halteproblem einmal intuitiv betrachten.\n", "\n", "Intuitiv gesehen stellt man beim speziellen Halteproblem die Frage, ob eine Turingmaschiene hält, wenn Sie sich selbst als eine Eingabe erhält.\n", "Um Turingmaschienen als Eingaben nutzen zu können benötigen wir eine Darstellung als Wörter über einem Alphabet. Als Alphabet wählen wir $\\Sigma$ = {0, 1} und als Möglichkeit eine TM über $\\Sigma$ darzustellen wählen wir die Gödelisierung. Die genau Definition finden Sie im Skript auf Seite 153 (zwischen Korrolar 10.18 und Beispiel 10.19). Für unsere Zwecke reicht es allerdings aus zu verstehen, dass mit der Gödelisierung jeder TM ein Wort aus $\\Sigma^*$ zugeordet wird. Auf Grund der Art der Gödelisierung gilt die Umkehrung allerdings nicht. Um die Umkehrabbildung angeben zu können sei $M_0$ eine beliebige feste TM. Dann ist für jedes Wort $w\\in\\Sigma^*$ eine TM $M_w$ definiert durch:\n", "\n", "$M_w$ = M, falls w = code(M)\n", "\n", "$M_w$ = $M_0$, sonst\n", "\n", "Mit dieser Definition lässt sich das spezielle Halteproblem definieren als:\n", "$K=\\{w\\in\\{0,1\\}^* | \\text{$M_w$angesetzt auf w hält nach endlich vielen Schritten}\\}$\n", "\n", "Nun zeigen wir, dass K nicht entscheidbar ist, es also keine TM gibt, die für jedes $x\\in\\Sigma^*$ entscheidet, ob es in K liegt oder nicht. Für einen Wiederspruchsbeweis nehmen wir an, dass K entscheidbar wäre.\n", "\n", "Sei H dann die TM, die für alle x entscheided, ob x in K liegt oder nicht.\n", "Wenn also die TM M mit code(M)=x hält, dann gibt H bei der Eingabe x 1 und sonst 0 aus.\n", "\n", "Sei nun N eine TM, die bei der Eingabe 1 in eine Endlosschleife läuft und bei der Eingabe 0 eine 1 ausgibt.\n", "\n", "Betrachten wir nun die TM C, die aus der Hintereinanderschaltung von H und N entsteht.\n", "Wenn wir C auf die Gödelisierung einer TM anwenden, die mit sich selbst als Eingabe hält, dann gibt H eine 1 aus und somit hält N nicht an. Damit hält auch C nicht.\n", "Und wenn wir C auf die Gödelisierung einer TM anwenden, die in eine Endlosschleife läuft, wenn Sie sich selbst als Eingabe erhält, dann gibt H eine O aus und somit N eine 1 und C hält.\n", "\n", "Wenn wir nun C auf sich selbst anwenden, was geschieht dann?\n", "Angenommen C hält, dann gibt H eine 1 aus und N läuft in eine Endlosschleife. Daher hält C nicht.\n", "Wenn C allerdings in eine Endlosschleife läuft, dann gibt H eine 0 aus und somit N eine 1. Damit hält C.\n", "Dies ist ein Wiederspruch dazu, dass K entscheidbar ist." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
Die Turingmaschiene $H$
Die Turingmaschiene $N$
Die Turingmaschiene $C$
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "ProB 2", "language": "prob", "name": "prob2" }, "language_info": { "codemirror_mode": "prob2_jupyter_repl", "file_extension": ".prob", "mimetype": "text/x-prob2-jupyter-repl", "name": "prob" } }, "nbformat": 4, "nbformat_minor": 4 }
 %% Cell type:markdown id: tags: # Das (spezielle) Halteproblem Im Skript wird das Halteproblem formal definiert. Hier wollen wir das Halteproblem einmal intuitiv betrachten. Intuitiv gesehen stellt man beim speziellen Halteproblem die Frage, ob eine Turingmaschiene hält, wenn Sie sich selbst als eine Eingabe erhält. Um Turingmaschienen als Eingaben nutzen zu können benötigen wir eine Darstellung als Wörter über einem Alphabet. Als Alphabet wählen wir $\Sigma$ = {0, 1} und als Möglichkeit eine TM über $\Sigma$ darzustellen wählen wir die Gödelisierung. Die genau Definition finden Sie im Skript auf Seite 153 (zwischen Korrolar 10.18 und Beispiel 10.19). Für unsere Zwecke reicht es allerdings aus zu verstehen, dass mit der Gödelisierung jeder TM ein Wort aus $\Sigma^*$ zugeordet wird. Auf Grund der Art der Gödelisierung gilt die Umkehrung allerdings nicht. Um die Umkehrabbildung angeben zu können sei $M_0$ eine beliebige feste TM. Dann ist für jedes Wort $w\in\Sigma^*$ eine TM $M_w$ definiert durch: $M_w$ = M, falls w = code(M) $M_w$ = $M_0$, sonst Mit dieser Definition lässt sich das spezielle Halteproblem definieren als: $K=\{w\in\{0,1\}^* | \text{$M_w$angesetzt auf w hält nach endlich vielen Schritten}\}$ Nun zeigen wir, dass K nicht entscheidbar ist, es also keine TM gibt, die für jedes $x\in\Sigma^*$ entscheidet, ob es in K liegt oder nicht. Für einen Wiederspruchsbeweis nehmen wir an, dass K entscheidbar wäre. Sei H dann die TM, die für alle x entscheided, ob x in K liegt oder nicht. Wenn also die TM M mit code(M)=x hält, dann gibt H bei der Eingabe x 1 und sonst 0 aus. Sei nun N eine TM, die bei der Eingabe 1 in eine Endlosschleife läuft und bei der Eingabe 0 eine 1 ausgibt. Betrachten wir nun die TM C, die aus der Hintereinanderschaltung von H und N entsteht. Wenn wir C auf die Gödelisierung einer TM anwenden, die mit sich selbst als Eingabe hält, dann gibt H eine 1 aus und somit hält N nicht an. Damit hält auch C nicht. Und wenn wir C auf die Gödelisierung einer TM anwenden, die in eine Endlosschleife läuft, wenn Sie sich selbst als Eingabe erhält, dann gibt H eine O aus und somit N eine 1 und C hält. Wenn wir nun C auf sich selbst anwenden, was geschieht dann? Angenommen C hält, dann gibt H eine 1 aus und N läuft in eine Endlosschleife. Daher hält C nicht. Wenn C allerdings in eine Endlosschleife läuft, dann gibt H eine 0 aus und somit N eine 1. Damit hält C. Dies ist ein Wiederspruch dazu, dass K entscheidbar ist. %% Cell type:markdown id: tags:
Die Turingmaschiene $H$
Die Turingmaschiene $N$
Die Turingmaschiene $C$
%% Cell type:code id: tags:  prob 
 \ No newline at end of file
 \ No newline at end of file
 \ No newline at end of file
 \ No newline at end of file
 \ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
 { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Der Satz von Myhill und Nerode\n", "Wir betrachten die Myhill-Nerode-Äquivalenzrelation anhand der Sprache L = {a, b, aa, bb, aac, bbc, ccc}." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Loaded machine: EquivalenceRelation" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "MACHINE EquivalenceRelation\n", "/* Ein Modell der Myhill-Nerode Äquivalenzrelation R_L,\n", " der entsprechenden Äquivalenzklassen und dem Index der Sprache.*/\n", "SETS\n", " Alphabet = {a,b,c}\n", "CONSTANTS L, RL, maxsize, All, Classes, index\n", "DEFINITIONS\n", " class(x) == {y | x↦y : RL} ;\n", " ANIMATION_FUNCTION1 == {r,c,i |r=1 ∧ c∈ dom(word) ∧ i=word(c)};\n", " ANIMATION_FUNCTION2 == {r,c,i |r=2 ∧ c=1 ∧ i=z};\n", " ANIMATION_FUNCTION3 == {(1, 0, \"Wort:\"), (2, 0, \"Äquivalenzklasse:\")};\n", " \n", "PROPERTIES\n", " L ⊆ seq(Alphabet) ∧\n", " \n", " // All = {z | z∈seq(Alphabet) ∧ size(z)<=maxsz} & /* beschränkt auf endliche Folgen */\n", " All = UNION(ii).(ii:0..maxsize| (1..ii) --> Alphabet) ∧\n", "\n", " RL = ({x,y| x∈All ∧ y∈All ∧ ∀z.(z∈All ⇒ ( x^z ∈ L ⇔ y^z ∈ L))}) ∧\n", "\n", " L = {[a],[b],[a,a],[b,b],[a,a,c],[b,b,c],[c,c,c]} ∧ maxsize = 3 ∧\n", "\n", " Classes = ran( %x.(x∈All|class(x))) ∧ /* Menge der Äquivalenzklassen {class(x)|x∈All} */\n", " index = card( Classes ) \n", "\n", "ASSERTIONS\n", " /* Test ob wir eine Äquivalenzrelation haben: */\n", " ∀x.(x∈All ⇒ x↦x ∈ RL); /* Reflexivität */\n", " ∀(x,y).(x↦y ∈ RL ⇒ y↦x ∈ RL); /* Symetrie */\n", " ∀(x,y,z).(x↦y ∈ RL ∧ y↦z ∈ RL ⇒ x↦z ∈ RL); /* Transitivität */\n", "\n", " /* Einige Beispiele : */\n", " [a,a] ↦ [b,b] ∈ RL;\n", " [a,a] ↦ [c,c] ∉ RL;\n", " [b,b,c] ↦ [c,c,c] ∈ RL;\n", " class([a,a]) = {[a,a],[b,b]};\n", " class([c,c,c]) = {[a,a,c],[b,b,c],[c,c,c]}\n", "\n", "/* Der durch die Äquivalenzklassen induzierte DFA: */\n", "VARIABLES z, word\n", "INVARIANT z ⊆ All ∧ word ∈ seq(Alphabet)\n", "INITIALISATION z := class([]); word := []\n", "OPERATIONS\n", " Delta(terminal) = PRE terminal∈Alphabet THEN\n", " ANY x WHERE x∈z ∧ ∀x2.(x2∈z ⇒ size(x2)≥size(x)) THEN\n", " z := class(x^[terminal]);\n", " word := word^[terminal]\n", " END\n", " END;\n", " Final = SELECT z ∩ L ≠ {} THEN skip END\n", "END" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Machine constants set up using operation 0: $setup_constants()" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ ":constants" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Machine initialised using operation 1:$initialise_machine()" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ ":init" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/markdown": [ "$8$" ], "text/plain": [ "8" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Da der $Index(L)=8<\\infty$ ist die gegebene Sprache regulär." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Durch die Äquivalenzklassen wird ein Minimalautomat induziert.\n", "Die Menge der Zustände ist gleich der Menge der Äquivalenzklassen.\n", "Und nach dem Einlesen eines Wortes $w∈Σ^*$ landet man in dem Zustand, der der Äquivalenzklasse von $w$ bezüglich $R_L$ entspricht." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Machine: EquivalenceRelation\n", "Sets: Alphabet\n", "Constants: L, RL, maxsize, All, Classes, index\n", "Variables: z, word\n", "Operations: \n", "Delta(a)\n", "Delta(b)\n", "Delta(c)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ ":browse" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Executed operation: Delta(a)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ ":exec Delta terminal=a" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Executed operation: Delta(a)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ ":exec Delta terminal=a" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "
Wort:aa
Äquivalenzklasse:{{(1|->a),(2|->a)},{(1|->b),(2|->b)}}
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ ":show" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ein weiteres Beispiel ist die Sprache $L=\\{a^n | n\\geq0\\}$.\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Loaded machine: EquivalenceRelation2" ]