{"id":837,"date":"2012-11-12T12:13:57","date_gmt":"2012-11-12T10:13:57","guid":{"rendered":"http:\/\/fernuni.digreb.net\/?p=837"},"modified":"2025-11-25T22:39:47","modified_gmt":"2025-11-25T21:39:47","slug":"ti-berechenbarkeit-ke4","status":"publish","type":"post","link":"https:\/\/fernuni.digreb.net\/?p=837","title":{"rendered":"TIA: Berechenbarkeit (Lernziele aus KE4, Update 6)"},"content":{"rendered":"<p><del><b>Update:\u00a0<\/b>ich modelliere auch diesen Beitrag auf die Lernziele um. Evtl. kann es sein, dass der Beitrag nicht ganz fertig wird, so dass ein paar Antworten (noch) leer sind. Da ich ihn aber nicht speichern kann ohne ihn zu aktualisieren oder ihn offline nehmen m\u00fcsste, habe ich keine andere Wahl als das zun\u00e4chst so zu handhaben.<\/del><\/p>\n<p><strong>Update 6<\/strong>: Nachdem ich nun schon zwei Mails zum Thema \\(\\mu\\)-Rekursion bekommen habe, m\u00f6chte ich das hier noch einmal ausf\u00fchren. F\u00fcr die Details zum Thema Nullstellen m\u00f6chte ich mich hier auch bei Oliver bedanken. Lernziel 5 also.<\/p>\n<p><strong>Update 5<\/strong>: mir ist was zur Standardnummerierung von \\(\\Sigma^{*}\\) und \\(P^{(1)}\\) aufgefallen, dass ich hier passend unbedingt noch erw\u00e4hnen musste.<\/p>\n<p><strong>Riesen Update<\/strong>: alle Lernziele habe ich nun \u00fcberarbeitet und einige Ungenauigkeiten korrigiert. Der Beweis der nicht-berechenbaren Funktionen ist wohl auf das 10-fache des urspr\u00fcnglichen Texts angewachsen. Irgendwie konnte ich mich mit dem alten Verweis auf das Diagonalrgument von Cantor f\u00fcr die \u00dcberabz\u00e4hlbarkeit der reellen Zahlen nicht anfreunden (beim ersten Erstellen hielt ich das noch f\u00fcr ausreichend) und habe den Skriptbeweis nun komplett auseinander genommen. Hoffentlich hilft es euch.<\/p>\n<p>Kurseinheit 4 ist wieder ein Rundumschlag. Einige Dinge, die hier drin sind, h\u00e4tten sich auch in Kurseinheit 2 wiederfinden m\u00fcssen (LOOP, WHILE, Churchsche These und Zusammenhang zu \\(\\mu\\)-rekursiven Funktionen. Taten sie aber nicht. W\u00e4re wahrscheinlich einfach zu einfach gewesen. Ich w\u00fcrde daher vorschlagen, dass wir uns ausnahmsweise nicht thematisch, sondern anhand der Lernziele entlang hangeln.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Rekapitulation: Zahlen, W\u00f6rter<\/strong><\/span><\/p>\n<p>Nochmal als Wiederholung bevor wir loslegen.<\/p>\n<p style=\"padding-left: 30px;\"><strong>Zahlenfunktionen<\/strong>: \\(f:\\subseteq \\mathbb{N}^k \\rightarrow \\mathbb{N}\\). D.h. Abbildung von ggf. mehrstelligen (unser \\(k\\)) Eingabewerten von nat\u00fcrlichen Zahlen auf einen einzigen Ausgabewert, eine einzige nat\u00fcrliche Zahl. Berechenbar mit Registermaschinen, nicht mit Turingmaschinen.<\/p>\n<p style=\"padding-left: 60px;\"><strong>Konkretes Beispiel<\/strong>: \\(f\\subseteq\\mathbb{N}^3\\rightarrow\\mathbb{N}\\) mit \\(f(x,y,z)=x+y-z\\),<\/p>\n<p style=\"padding-left: 60px;\">z.B. \\(f(431,469,899)=1\\)<\/p>\n<p style=\"padding-left: 30px;\"><strong>Wortfunktionen<\/strong>: \\(g:\\subseteq \\Sigma^{*k} \\rightarrow \\Sigma^{*}\\). D.h. Abbildung von ggf. mehreren\u00a0(wieder unser \\(k\\))\u00a0Eingabewerten von beliebig langen (unser \\(*\\)) Worten \u00fcber einem Alphabet (unser \\(\\Sigma\\)) auf einen einzigen Ausgabewert: ein einziges, beliebig langes Wort. \\(\\Sigma^{*}\\) ist hier die Wortmenge \u00fcber dem Alphabet \\(\\Sigma\\). Berechenbar mit Turingmaschinen, nicht mit Registermaschinen.<\/p>\n<p style=\"padding-left: 60px;\"><strong>Konkretes Beispiel<\/strong>: \\(g:\\subseteq \\Sigma^{*2}\\rightarrow \\Sigma^{*}\\) mit \\(g(x,y)=xy\\),<\/p>\n<p style=\"padding-left: 60px;\">z.B. \\(g(abbb,aaaa)=abbbaaaa\\)<\/p>\n<p>Wir k\u00f6nnen Zahlenfunktionen nicht auf Turingmaschinen und Wortfunktionen nicht auf Registermaschinen berechnen. Es gibt jedoch einen Weg: Erst wenn man W\u00f6rter in Zahlen codiert und Zahlen in W\u00f6rter (bijektive Abbildung zwischen zwei Mengen: W\u00f6rtern und Zahlen) kann man diese mit den entsprechend anderen Maschinen berechnen.<\/p>\n<p>Ausgenutzt wird dabei, dass Registermaschinen und Turingmaschinen \u00fcber Flussdiagramme definiert sind. Aber k\u00fcmmern wir uns zun\u00e4chst um die Standardnummerierung selbst.<\/p>\n<p>Das ist die sogenannte <em>Standardnummerierung<\/em> (bijektive Abbildung zwischen den nat\u00fcrlichen Zahlen und einer Mengen). Definition kommt gleich. Es gibt jedoch einen wesentlichen Unterschied zu einer Nummerierung, der nicht verschwiegen werden darf.<\/p>\n<p>Eine <em>Nummerierung<\/em>\u00a0ist nicht bijektiv;\u00a0<a href=\"https:\/\/de.wikipedia.org\/wiki\/Surjektivit%C3%A4t\">Surjektivit\u00e4t<\/a> reicht. Wir k\u00f6nnen in der Nummerierung dann jedem Wort mindestens eine Zahl zuordnen, aber wir haben keine eindeutige Umkehrabbildung, d.h. wenn wir dann zu einem Wort die zugeh\u00f6rige Zahl suchen, k\u00f6nnten wir diese mit etwas Pech auf mehrere Zahlen abbilden.<\/p>\n<p><strong>Achtung<\/strong>: w\u00e4hrend die Standardnummerierung von \\(\\Sigma^{*}\\) durch \\(\\nu_\\Sigma\\) bijektiv ist, ist die Standardnummerierung der berechenbaren, einstelligen Funktionen \\(P^{(1)}\\) aus dem <a title=\"TIA: Standardnummerierung und -Komplexit\u00e4t Phi und das Phi-Theorem (Lernziele KE5, 1\/2)\" href=\"https:\/\/fernuni.digreb.net\/?p=991\">n\u00e4chsten Beitrag<\/a> das nicht! Warum, sage ich dann dort. Bitte behaltet das unbedingt im Hinterkopf.<\/p>\n<p>Formal definiert ist eine <em>Nummerierung<\/em>\u00a0also:<\/p>\n<blockquote>\\(\\nu:\\subseteq\\mathbb{N}\\rightarrow{M}\\)<\/blockquote>\n<p>Sie kann partiell sein und ist &#8211; wie gesagt &#8211; surjektiv. Damit hat zwar jedes Element aus der nummerierten Menge \\(M\\) eine Zahl aus \\(\\mathbb{N}\\), aber nicht zu jeder Zahl aus \\(\\mathbb{N}\\)\u00a0gibt ein Element aus der Menge \\(M\\).<\/p>\n<p>Und weil Marco mich in den Kommentaren zu KE5 auf die Idee gebracht hat, noch eine kleine Nebeninfo: Haben wir eine bijektive Abbildung zwischen zwei Mengen, gelten diese als gleichm\u00e4chtig und die Eigenschaften der einen, gelten auch f\u00fcr die andere Menge. Bilden wir also die nat\u00fcrlichen Zahlen mittels einer bijektiven Funktion auf eine andere Menge ab, wie wir das mit der Standardnummerierung tun, so \u00fcbernimmt diese Menge eine wunderbare Eigenschaft der nat\u00fcrlichen Zahlen \\(\\mathbb{N}\\): sie ist dann ebenfalls <a href=\"http:\/\/de.wikipedia.org\/wiki\/Abz%C3%A4hlbare_Menge\">abz\u00e4hlbar unendlich<\/a>.<\/p>\n<h2>Lernziel 1<\/h2>\n<p style=\"padding-left: 30px;\"><em>Angabe und Erl\u00e4uterung der Definition einer Standardnummerierung von \\(\\Sigma^{*}\\)<\/em><\/p>\n<p>Nehmen wir als Beispiel ein Alphabet \\(\\Sigma\\)\u00a0 mit \\(n\\) Symbolen, welches eine totale Ordnung hat (d.h. die \\(n\\) Symbole innerhalb des Alphabets sind &#8211; wie auch immer &#8211; eindeutig sortiert), so beinhaltet \\(\\Sigma^*\\) alle Worte \u00fcber dem Alphabet \\(\\Sigma\\).<\/p>\n<p>\\(\\nu_\\Sigma(i)\\) ist das \\(i\\)-te Wort aus dieser sortierten Liste. Die Sortierung nennt man <em>Ordnungsfunktion<\/em>. Das spannende an dieser Nummerierung ist, dass sie <strong>bijektiv<\/strong> ist. Wir haben also eine eindeutige Abbildung von einem Wort in eine Zahl und eine Inverse, die uns zu einer Zahl ein eindeutiges Wort liefert. Lasst uns die Definition mal formalisieren:<\/p>\n<blockquote><p>\\(\\Sigma\\) ist ein Alphabet mit \\(card(\\Sigma) &gt;= 1\\).<\/p>\n<p>\\(a: \\{1,&#8230;,n\\} \\rightarrow \\Sigma\\) die Ordnungsfunktion \\(a\\) mit \\(a_i := a(i)\\) und \\(\\Sigma = \\{a_1, &#8230;, a_n\\}\\).<\/p>\n<p>\\(\\sigma:\\Sigma^* \\rightarrow \\mathbb{N}\\) mit \\(\\sigma(\\varepsilon):=0\\) sowie<\/p>\n<p>\\(\\sigma ({a_{i}}_{k} {a_{i}}_{k-1} &#8230; {a_{i}}_{1} {a_{i}}_{0}) := i_k n^k + i_{k-1} n^{k-1} + &#8230; i_1 n+i_0\\) f\u00fcr alle \\( k \\in \\mathbb{N}, i_0,&#8230;,i_k \\in \\{1,&#8230;,n\\}\\).<\/p>\n<p>\\(\\nu_\\Sigma : \\mathbb{N} \\rightarrow \\Sigma^*\\) ist unsere Inverse der Funktion \\(\\sigma\\) und damit \\(\\nu_\\Sigma := \\sigma^{-1}\\). Sie gibt uns zu einer gegebenen Zahl das entsprechende, eindeutige Wort zur\u00fcck und wird <strong>Standardnummerierung<\/strong> von \\(\\Sigma^{*}\\) genannt.<\/p><\/blockquote>\n<p>Keine Sorge, wir gehen das direkt an einem Beispiel durch.<\/p>\n<p><strong>Beispiel<\/strong>:<\/p>\n<p style=\"padding-left: 30px;\">\\(\\Sigma = \\{a,b\\}\\) mit \\(card(\\Sigma) = 2\\) (<a href=\"http:\/\/de.wikipedia.org\/wiki\/Kardinalit%C3%A4t_(Mathematik)\">Kardinalit\u00e4t<\/a>, M\u00e4chtigkeit einer Menge). Ein Alphabet mit den Buchstaben \\(a\\) und \\(b\\), d.h. nur \\(2\\) Elementen und damit der Kardinalit\u00e4t \\(2\\).<\/p>\n<p style=\"padding-left: 30px;\">Wir haben zwei Elemente \\(a\\) und \\(b\\) im Alphabet, also ist \\(n = 2\\) und wir haben \\(a_1 = a(1) = a\\) und \\(a_2 = a(2) = b\\): innerhalb der Wortmenge werden die Elemente wie im Skript nach L\u00e4nge und dann lexikographisch geordnet. Die Menge \\(\\Sigma^*\\) w\u00e4re dann<\/p>\n<p style=\"padding-left: 60px;\">\\(\\Sigma^*=\\{a,b,aa,ab,ba,bb,aaa,aab,aba,abb,baa,bab,bba,bbb,&#8230;\\}\\).<\/p>\n<p style=\"padding-left: 30px;\">Wir haben nun jedem unserer zwei Elemente eine Ordnungszahl zugewiesen. Das ist unsere Ordnungsfunktion \\(a\\).<\/p>\n<p style=\"padding-left: 30px;\">Der letzte Teil ist jetzt etwas ekelig, aber halb so wild. Erinnert mich irgendwie an SIMPLEX. Die Funktion \\(\\sigma\\) macht nichts anderes, als zu einem bestimmten Wort die eindeutige Zahl anhand der definierten Ordnung zu bestimmen. Wir suchen z.B. die zugewiesene Zahl zu \\(abb\\). \\(abb\\) steht an 10. Stelle in der Reihenfolge und wir erwarten die \\(10\\) auch als Ergebnis.<\/p>\n<p style=\"padding-left: 30px;\">\\(n = 2\\) (ist klar, die Kardinalit\u00e4t von \\(\\Sigma\\), d.h. Anzahl der Elemente)<\/p>\n<p style=\"padding-left: 30px;\">\\(k = 2\\) (das Wort \\(abb\\) besteht aus drei Elementen, wir z\u00e4hlen von \\(0\\) und haben damit \\(k=2\\))<\/p>\n<p style=\"padding-left: 30px;\">\\(i\\) ist unsere Ordnungszahl. Da \\(a\\) zuerst kommt, ist \\(a=1\\) und da \\(b\\) an zweiter Stelle in unserer Ordnung kommt, ist \\(b=2\\). H\u00e4tten wir noch \\(c\\), so w\u00e4re \\(c=3\\) unserer festgelegten Ordnung nach.<\/p>\n<p style=\"padding-left: 30px;\">\\(\\begin{array} {lcl}\\sigma(abb)&amp;=&amp;1\\cdot2^2 + 2\\cdot2 + 2\\\\{}&amp;=&amp;4+4+2\\\\{}&amp;=&amp;10\\end{array}\\)<\/p>\n<p style=\"padding-left: 30px;\">Und ja, \\(abb\\) steht an 10. Stelle in unserer Ordnung.<\/p>\n<p>Man mache sich einfach klar, dass ein beliebiges Alphabet \\(\\Sigma\\) definieren k\u00f6nnen, solange wir nur eine numerische Ordnung auf den Elementen des Alphabets definieren. Da wir aus den Elementen des Alphabets Worte bauen k\u00f6nnen, k\u00f6nnen wir auch aus den Ordnungszahlen, die den Elementen zugeordnet sind Kombinationen herstellen.<\/p>\n<p>Die Ordnung ist ja nichts weiter als die Festlegung der Reihenfolge der verwendeten Elemente in unserem Alphabet. Damit rechnen wir statt mit den Buchstaben, nun mit ihren &#8222;Ordnungszahlen&#8220;. Und da auf den verwendeten, nat\u00fcrlichen Zahlen f\u00fcr unsere Reihenfolge auch eine nat\u00fcrliche Ordnung herrscht (\\(1&lt;2&lt;3&lt;4&lt;&#8230;\\)), k\u00f6nnen wir damit wunderbar rechnen.<\/p>\n<p>Unser \\(a\\) im Alphabet repr\u00e4sentiert unsere &#8222;Ordnungszahl&#8220; \\(1\\) und \\(b\\) unsere &#8222;Ordnungszahl&#8220; \\(2\\), welche wir dann oben in der Gleichung f\u00fcr \\(\\sigma(abb)\\) verwendet haben und damit auf den Rechenweg <span style=\"color: #000000;\"><span style=\"color: #339966;\">\\(1\\)<\/span> \\(\\cdot2^2 +\\) <span style=\"color: #ff0000;\">\\(2\\)<\/span> \\(\\cdot2^1 +\\) <span style=\"color: #ff0000;\">\\(2\\)<\/span> \\(\\cdot2^0\\)<\/span> kommen. Die gr\u00fcne 1 ist daher die Ordnungszahl unseres \\(a\\) und die rote 2 die unseres \\(b\\).<\/p>\n<p>Die Inverse zu \\(\\sigma(a)\\) (\\(a\\) ist ein Wort) ist \\(\\sigma^{-1}=\\nu_\\Sigma(i)\\) und gibt uns f\u00fcr eine Zahl \\(i\\) das dazugeh\u00f6rige Wort. Das 10. Wort w\u00e4re also \\(\\nu_\\Sigma(10) = abb\\).<\/p>\n<p>Damit ist \\(\\nu_{\\Sigma}\\) eine <strong>Standardnummerierung<\/strong> von \\(\\Sigma^{*}\\), also aller Worte \u00fcber dem Alphabet \\(\\Sigma\\).<\/p>\n<p><strong>Antwort zum Lernziel<\/strong>: die Standardnummerierung \\(\\nu_{\\Sigma}\\) der Worte \u00fcber einem Alphabet \\(\\Sigma\\) ist eine bijektive Abbildung zwischen den nat\u00fcrlichen Zahlen \\(\\mathbb{N}\\) und den Worten aus \\(\\Sigma^{*}\\). Die Bijektivit\u00e4t ist wichtig damit wir einer Zahl eindeutig ein Wort und einem Wort eindeutig eine Zahl zuweisen k\u00f6nnen.<\/p>\n<p>Diese Zuweisung funktioniert aufgrund einer sog. Ordnungsfunktion \\(a\\) auf dem Alphabet \\(\\Sigma\\), welches jedem Zeichen aus den Alphabet eine eindeutige Nummer (Ordnungszahl) aus den nat\u00fcrlichen Zahlen zuordnet. Durch die nat\u00fcrliche Ordnung auf den nat\u00fcrlichen Zahlen \\(\\mathbb{N}\\) haben wir auch eine nat\u00fcrliche Ordnung auf den Elementen aus unserem Alphabet \\(\\Sigma\\), die wir vorher nicht hatten.<\/p>\n<p>Mit \\(\\sigma(a)\\) bekommen wir somit zu einem Wort \\(a\\) die zugeh\u00f6rige Ordnungszahl \\(i\\) und mit \\(\\nu_{\\Sigma}(i)\\) zu einer Zahl \\(i\\) das zugeh\u00f6rige Wort aus den Worten \u00fcber dem Alphabet \\(\\Sigma\\): \\(\\Sigma^{*}\\).<\/p>\n<h2>Lernziel 2<\/h2>\n<p style=\"padding-left: 30px;\"><em>Formulierung und Erl\u00e4uterung der Beziehung zwischen Zahlen- und Wortfunktionen<\/em><\/p>\n<p>Zun\u00e4chst noch einmal die Definition wann Wortfunktionen berechenbar sind:<\/p>\n<blockquote><p>Eine\u00a0<strong>(ggf. partielle) Wortfunktion<\/strong>\u00a0\\(g : \\subseteq (\\Sigma^*)^k \\rightarrow \\Sigma^*\\) ist genau dann berechenbar, wenn es eine Turing-Maschine \\(T\\) gibt, die die Funktion berechnet. Wenn also \\(g =g_T\\) gilt.<\/p><\/blockquote>\n<p>Das gleiche Spiel f\u00fcr Zahlenfunktionen.<\/p>\n<blockquote><p>Eine\u00a0<strong>(ggf. partielle) Zahlenfunktion<\/strong>\u00a0\\(f : \\subseteq \\mathbb{N}^k \\rightarrow \\mathbb{N}\\) ist genau dann berechenbar, wenn es eine Registermaschine \\(M\\) gibt, die die Funktion berechnet. Wenn also \\(f = f_M\\) gilt.<\/p><\/blockquote>\n<p>Kennen wir schon aus den alten Beitr\u00e4gen. Registermaschinen f\u00fcr Zahlen- und Turingmaschinen f\u00fcr Wortfunktionen. Langweilig. But wait, there&#8217;s more! Im Zusammenhang mit der Standardnummerierung hatten wir das noch nicht. Denn wir k\u00f6nnen Wortfunktionen durchaus mit Registermaschinen und Zahlenfunktionen mit Turingmaschinen berechnen.<\/p>\n<p>Man macht sich zun\u00e4chst noch einmal folgenden Zusammenhang klar: Unsere (\\(k\\)-steligen) Wortfunktionen, welche die Turingmaschinen (Mehrbandmaschinen mit \\(k\\) B\u00e4ndern) berechnen k\u00f6nnen, k\u00f6nnen auch auf Einbandmaschinen berechnet werden (Ihr erinnert euch: <a title=\"TIA: Turingmaschinen, Bandmaschinen und berechenbare Wortfunktionen (Lernziele KE3)\" href=\"https:\/\/fernuni.digreb.net\/?p=2133\">Spuren, Hilfssymbole, etc.<\/a>?). Wir k\u00f6nnen uns also auf die Betrachtung der Einbandmaschinen f\u00fcr die Berechnung der Wortfunktionen beschr\u00e4nken.<\/p>\n<p><span style=\"font-size: 13px;\">Und hier kommt die Standardnummerierung ins Spiel: wollen wir eine Wortfunktion auf einer Registermaschine berechnen, geht das zun\u00e4chst nicht. Die Registermaschine rechnet ja mit Zahlen und nicht mit Worten. Und auch als Ausgabe bekommen wir eine Zahl und kein Wort. Aber hey! Wir k\u00f6nnen die Worte ja mit unserer Standardnummerierung eindeutig auf Zahlen und Zahlen eindeutig auf Worte abbilden. Damit gelingt es uns die Eingabeworte f\u00fcr unsere Turingmaschine in eine Zahl zu verwandeln, damit die Registermaschine zu f\u00fcttern und die Ausgabe dieser (die ja auch eine Zahl ist) wieder in ein Wort zu verwandeln.\u00a0<\/span><\/p>\n<p>Die Standardnummerierung erledigt das. Was uns hier noch fehlt ist die Umwandlung der Flussdiagramm der Turing- in eine passende Registermaschine. Das geschieht wie folgt:<\/p>\n<ul style=\"list-style-type: square; padding-left: 30px;\">\n<li><span style=\"line-height: 13px;\"><strong>Aufbereitung der Eingabe<\/strong>: jedes Register bekommt die eindeutige Nummer der Eingabeworte. Nur Register \\(R_0\\), unser Ausgaberegister bleibt leer. Die Worte der \\(k\\) Arbeitsb\u00e4nder werden so alle in die Register abgebildet. Ein Register bekommt also \\(\\sigma(a)\\) zugewiesen, z.B.\u00a0\\(R_1=\\sigma(abb)=10\\).<\/span><\/li>\n<li><strong>Simulation des Flussdiagramms<\/strong> der Turingmaschine (hier lasse ich die Details erstmal weg, evtl. trage ich sie nach)<\/li>\n<\/ul>\n<p>Nun k\u00f6nnen wir auch mit der formalen Definition des Zusammenhangs etwas anfangen:<\/p>\n<blockquote><p>Sei \\(\\Sigma\\) ein Alphabet, \\(\\nu_\\Sigma : \\mathbb{N} \\rightarrow \\mathbb{N}\\) eine Standardnummerierung von \\(\\Sigma^*\\), \\(k \\in \\mathbb{N}\\). Es sei \\(f : \\subseteq \\mathbb{N}^k \\rightarrow \\mathbb{N}\\) und \\(g : \\subseteq (\\Sigma^*)^k \\rightarrow \\Sigma^*\\). Dann gilt:<\/p>\n<p>\\(f\\) berechenbar \\(\\Longleftrightarrow\\) \\(\\nu_\\Sigma f\\bar{\\nu_\\Sigma}^-1 : \\subseteq (\\Sigma^*)^k \\rightarrow \\Sigma^*\\) berechenbar.<\/p>\n<p>\\(g\\) berechenbar \\(\\Longleftrightarrow\\) \\(\\nu_\\Sigma^-1 g\\bar{\\nu_\\Sigma} : \\subseteq \\mathbb{N}^k \\rightarrow \\mathbb{N}\\) berechenbar.<\/p><\/blockquote>\n<p>Harter Tobak. Der Satz besagt eig. nichts anderes, als dass<\/p>\n<p style=\"padding-left: 30px;\"><em>Die Wortfunktion \\(g\\) genau dann berechenbar ist, wenn ihre Verschl\u00fcsselung \\(\\nu_\\Sigma^-1 g\\bar{\\nu_\\Sigma}\\) eine berechenbare Zahlenfunktion ist<\/em><\/p>\n<p>und<\/p>\n<p style=\"padding-left: 30px;\"><em>Die Zahlenfunktion \\(f\\) genau dann berechenbar ist, wenn ihre Verschl\u00fcsselung \\(\\nu_\\Sigma f\\bar{\\nu_\\Sigma}^-1\\) eine berechenbare Wortfunktion ist.<\/em><\/p>\n<p>Also genau das, was wir oben bereits beschrieben haben. Versuchen wir dass mal anhand eines Beispiels aufzudr\u00f6seln:<\/p>\n<p><strong>Beispiel<\/strong>: \\(\\Sigma := \\{a,b\\}\\), \\(\\nu_\\Sigma : \\mathbb{N} \\rightarrow \\Sigma^*\\) mit der Ordnungsfunktion \\(a: \\{1,&#8230;,n\\} \\rightarrow \\Sigma\\),<\/p>\n<p style=\"padding-left: 30px;\">d.h. \\(a\\) ist wieder unser \\(1\\). und \\(b\\) unser \\(2\\). Element in der Ordnung.<\/p>\n<p style=\"padding-left: 30px;\">Wir definieren \\(f\\) und \\(g\\) willk\u00fcrlich:<\/p>\n<p style=\"padding-left: 30px;\">\\(f(x)\\begin{cases} {} &amp; 1, \\mbox{ wenn } x = 2 \\\\{} &amp; 2, \\mbox{ wenn } x = 1 \\end{cases}\\)<\/p>\n<p style=\"padding-left: 30px;\">\\(g(x)\\begin{cases} {} &amp; a, \\mbox{ wenn } x = b \\\\{} &amp; b, \\mbox{ wenn } x = a \\end{cases}\\)<\/p>\n<p style=\"padding-left: 30px;\">Wir m\u00fcssen uns anschauen, was \\(\\nu_\\Sigma^-1 g\\bar{\\nu_\\Sigma}\\) und \\(\\nu_\\Sigma f\\bar{\\nu_\\Sigma}^-1\\) aus der Definition von oben denn nun tats\u00e4chlich tun.<\/p>\n<p style=\"padding-left: 30px;\">Fangen wir mit \\(\\nu_\\Sigma^-1 g\\bar{\\nu_\\Sigma}\\) an, denn es liefert uns zu der Nummer des Definitionswertes (ein Wort) die Nummer des Bildes\/Funktionswerts (ja eig. auch ein Wort):<\/p>\n<p style=\"padding-left: 30px;\">Wir machen uns zun\u00e4chst einmal klar, dass \\(\\nu_\\Sigma(1) = a\\) ist, denn \\(a\\) ist das erste Element und \\(\\nu_\\Sigma\\) gibt uns zu einer Zahl das Wort aus. Die Inverse w\u00e4re dann \\(\\nu_\\Sigma^-1(a) = 1\\), zu einem Wort bekommen wir also seine eindeutige Nummer.<\/p>\n<p style=\"padding-left: 30px;\">Und lasst euch von \\(\\nu_\\Sigma^-1 g\\bar{\\nu_\\Sigma}(i)\\) nicht erschrecken. Es ist nur eine <a href=\"http:\/\/de.wikipedia.org\/wiki\/Komposition_(Mathematik)\">Komposition<\/a> aus den oben genannten Funktionen und sieht geklammert weniger bedrohlich aus: \\(\\nu_\\Sigma^-1 (g(i))\\). Aber der Reihe nach.<\/p>\n<p style=\"padding-left: 30px;\">Unserer oben definierten Funktion \\(g\\) nach, ist z.B. \\(g(a) = b\\). Zu dem\u00a0 Definitionswert \\(a\\) bekommen wir also das Bild\/den Funktionswert \\(b\\). Was tun wir nun wenn wir statt auf Worten (was \\(a\\) und \\(b\\) ja selbstredend sind) nun auf den zugeh\u00f6rigen Zahlen rechnen wollen? Die Funktionalit\u00e4t der Ursprungsfunktion soll dabei nat\u00fcrlich erhalten bleiben. Und genau das geht mit unserem\u00a0\\(\\nu_\\Sigma^-1 g\\bar{\\nu_\\Sigma} (i)\\), was ja nur &#8211; wie gesagt &#8211; eine Komposition von Funktionen ist.<\/p>\n<p style=\"padding-left: 30px;\">Wir tun das, was wir wollten (auf den Zahlen der Worte \\(a\\) und \\(b\\) rechnen statt auf den Worten selbst) und setzen \\( i = 1\\), da der Zahlenwert unseres Arguments \\(\\nu_\\Sigma^-1(a)=1\\) ist und dr\u00f6seln auf:<\/p>\n<p style=\"padding-left: 30px;\">\\(\\begin{array}{lcl}\\nu_\\Sigma^-1 g\\nu_ \\Sigma(1)&amp;=&amp;\\nu_\\Sigma^-1 (g (\\nu_ \\Sigma(1)))&amp;\\mbox{Ausklammern fuer bessere Lesbarkeit}&amp;\\\\ {}&amp;=&amp;\\nu_\\Sigma^-1 (g (a))&amp;\\mbox{da }\\nu_ \\Sigma(1) = a \\mbox { ist}&amp;\\\\ {}&amp;=&amp;\\nu_\\Sigma^-1 (b) &amp;\\mbox{da } g (a) = b \\mbox { ist}&amp;\\\\ {}&amp;=&amp;2&amp;\\mbox {da }\\nu_\\Sigma^-1 (b) = 2 \\mbox { ist}&amp;\\end{array}\\)<\/p>\n<p>Ergebnis passt? Passt!<\/p>\n<p>Damit haben wir dank unserer Standardnummerierung unsere Wortfunktion \\(g\\) in eine Zahlenfunktion \u00fcberf\u00fchrt und k\u00f6nnen ruhigen Gewissens erneut sagen:<\/p>\n<blockquote><p><em>Die Wortfunktion \\(g\\) ist berechenbar gdw. ihre Verschl\u00fcsselung \\(\\nu_\\Sigma^-1 g\\bar{\\nu_\\Sigma}\\) eine berechenbare Zahlenfunktion ist.<\/em><\/p><\/blockquote>\n<p>Damit kann man nun eine Zahlenfunktion angeben, welche statt \\(a\\) auf \\(b\\) abzubilden nun eine \\(1\\) auf eine \\(2\\) abbildet. Ist diese berechenbar, so ist auch eine Wortfunktion berechenbar.<\/p>\n<p>Analog geht der gleiche Spa\u00df mit \\(\\nu_\\Sigma f\\bar{\\nu_\\Sigma}^-1\\), was unsere Zahlenfunktion \\(f\\) in eine Wortfunktion verschl\u00fcsselt. Wir setzen statt \\( i = 1\\) nun einfach \\(i=a\\) und schauen ob wir \\(b\\) herausbekommen.<\/p>\n\\(\\begin{array}{lcl}\\nu_\\Sigma f\\bar{\\nu_\\Sigma}^-1(a)&amp;=&amp;\\nu_\\Sigma(f(\\bar{\\nu_\\Sigma}^-1(a)))&amp;\\mbox{Ausklammern fuer bessere Lesbarkeit}&amp;\\\\ {}&amp;=&amp;\\nu_\\Sigma(f(1))&amp;\\mbox{da }\\bar{\\nu_\\Sigma}^-1(a) = 1 \\mbox { ist}&amp;\\\\ {}&amp;=&amp;\\nu_\\Sigma(2) &amp;\\mbox{da } f (1) = 2 \\mbox { ist}&amp;\\\\ {}&amp;=&amp;b&amp;\\mbox {da }\\nu_\\Sigma(2) = b \\mbox { ist}&amp;\\end{array}\\)\n<p>Wow! Was man mit den nat\u00fcrlichen Zahlen alles anstellen kann! Wir haben unsere Zahlenfunktion \\(f\\) nun in eine Wortfunktion verschl\u00fcsselt und schlie\u00dfen unser Beispiel mit folgenden Worten ab:<\/p>\n<blockquote><p><em>Die Zahlenfunktion \\(f\\) ist berechenbar gdw. ihre Verschl\u00fcsselung \\(\\nu_\\Sigma f\\bar{\\nu_\\Sigma}^-1\\) eine berechenbare Wortfunktion ist.<\/em><\/p><\/blockquote>\n<p>That&#8217;s it.<\/p>\n<p><strong>Antwort zum Lernziel<\/strong>: mittels Standardnummerierung ist es uns m\u00f6glich Worte in Zahlen und Zahlen in Worte bijektiv zu verschl\u00fcsseln. Da Register- und Turingmaschinen \u00fcber Flussdiagrammen definiert sind, k\u00f6nnen wir diese ineinander simulieren und durch die Standardnummerierung so mit Registermaschinen auf Worten und mit Turingmaschinen im\u00a0Endeffekt auf Zahlen arbeiten.<\/p>\n<h2>Lernziel 3<\/h2>\n<p style=\"padding-left: 30px;\"><em>Definition der primitiv-rekursiven Funktionen<\/em><\/p>\n<p><span style=\"font-size: 13px;\">Im Beitrag \u00fcber <\/span><a style=\"font-size: 13px;\" title=\"TI: Primitive Rekursion\/LOOP Berechenbarkeit (2. Update)\" href=\"https:\/\/fernuni.digreb.net\/?p=578\">primitiv rekursive Funktionen und LOOP Berechenbarkeit<\/a><span style=\"font-size: 13px;\"> haben wir das Thema bereits behandelt. Daher nur ein kurzer Abriss der Definition:<\/span><\/p>\n<blockquote><p>Eine Funktion \\(f:\\mathbb{N}^k\\rightarrow\\mathbb{N}\\) hei\u00dft primitiv-rekursiv wenn sie sich in endlich vielen Schritten aus der menge der <strong>Grundfunktionen<\/strong> durch wiederholtes Anwenden der Substitution und primitiver Rekursion erzeugen l\u00e4sst.<\/p>\n<p>Diese Menge nennen wir \\(PRK\\).<\/p><\/blockquote>\n<p>PS: sie sind alle total (wichtig!) und eine echte Teilmenge der \\(\\mu\\)-rekursiven Funktionen (kommen wir sp\u00e4ter noch darauf zur\u00fcck).<\/p>\n<p>Die im Skript genannten <strong>Grundfunktionen<\/strong> sind:<\/p>\n<ul style=\"list-style-type: square; padding-left: 30px;\">\n<li>Null- und einstellige Nullfunktion<\/li>\n<li>Nachfolgefunktion<\/li>\n<li>Projektion<\/li>\n<\/ul>\n<p>Alle Funktionen, die wir damit und durch wiederholtes Anwender der primitiven Rekursion und Substitution\u00a0erstellen k\u00f6nnen, sind ebenfalls primitiv-rekursiv aufgrund der Abgeschlossenheit. Beispiele zu diesen findet Ihr im oben verlinkten Beitrag.<\/p>\n<p>Wir hatten das bereits <a title=\"TIA: Primitive Rekursion\/LOOP Berechenbarkeit (2. Update)\" href=\"https:\/\/fernuni.digreb.net\/?p=578\">im Beitrag<\/a> zur \\(LOOP\\)-Berechenbarkeit ausgearbeitet, es sei dennoch der Vollst\u00e4ndigkeit halber darauf hingewiesen:<\/p>\n<blockquote><p>Eine Funktion \\(f\\) ist \\(LOOP\\)-berechenbar genau dann wenn sie primitiv-rekursiv ist.<\/p><\/blockquote>\n<p>Nicht vergessen. \ud83d\ude09<\/p>\n<p><strong>Antwort zum Lernziel<\/strong>: die Menge der primitiv-rekursiven Funktionen \\(PRK\\) wird \u00a0mittels der oben genannten Grundoperationen und wiederholtes Anwenden der Substitution (\\(Sub\\)) und primitiver Rekursion (\\(Prk\\)) gebildet. Es sind alles totale Funktionen (d.h. \u00fcberall definiert) und bilden eine Teilmenge\u00a0der \\(\\mu\\)-rekursiven Funktionen.<\/p>\n<h2>Lernziel 4<\/h2>\n<p style=\"padding-left: 30px;\"><em>Beweis, dass bestimmte Funktionen primitiv-rekursiv sind<\/p>\n<p><\/em><\/p>\n<p>In dem\u00a0<a href=\"https:\/\/fernuni.digreb.net\/?p=578\">oben verlinkten Beitrag<\/a>\u00a0k\u00f6nnt Ihr euch die Details dazu zu Gem\u00fcte f\u00fchren. Wir zeigen dort, dass die Addition primitiv-rekursiv ist.<\/p>\n<p><strong>Antwort zum Lernziel<\/strong>:\u00a0F\u00fcr den Beweis, dass eine Funktion primitiv-rekursiv ist wird diese einfach mittels der Grundoperationen (oder der als primitiv-rekursiv bereits bewiesenen anderen Operationen) nachgebildet. Damit gilt die Funktion f\u00fcr ein \\(n\\) als bewiesen. Mittels vollst\u00e4ndiger Induktion wird es dann auch f\u00fcr \\(n+1\\) gezeigt.<\/p>\n<h3>Ex-Lernziel: Rechenzeitsatz<\/h3>\n<p>Ebenfalls wird im Skript jedoch der Rechenzeitsatz erw\u00e4hnt. Der besagt nichts anderes, als dass eine Maschine \\(M\\), welche eine Funktion \\(f: \\mathbb{N}^k \\rightarrow \\mathbb{N}\\) f\u00fcr eine Eingabe von \\(x_1,&#8230;,x_k\\) eine bestimmte Anzahl an Schritten rechnet. Die Anzahl der Schritte wird mit \\(Zeit_M(x_1,&#8230;,x_k)\\) bezechnet.<\/p>\n<p>Gibt es diese Anzahl von Schritten, so ist die Funktion \\(f\\) primitiv rekursiv und die Anzahl der Schritte durch eine Funktion \\(A_n\\) (\\(Zeit_M(x_1,&#8230;,x_k) &lt;= c \\cdot max(x_1,&#8230;,x_k) + c\\)) beschr\u00e4nkt. Wir haben hier also nichts weiter als die Beschr\u00e4nkung der Rechenschritte einer Registermaschine beim Berechnen einer Funktion abh\u00e4ngig vom Eingabewert der Funktion, einer Konstanten und einer anderen primitiv rekursiven Funktion. Im Skript wird \\(A_n\\) als Funktion verwendet, aber Achtung: das ist <strong>nicht<\/strong> die Ackermann-Funktion, denn diese ist nicht primitiv rekursiv und \\(A_n\\) muss primitiv rekursiv sein!<\/p>\n<p>Alle Funktionen, die sich auf einer Registermaschine nicht in \\(c \\cdot 2^x + x\\) (Exponentialzeit) berechnen lassen, gelten lt. Skript als &#8222;nicht in der Praxis berechenbar&#8220;. Damit sind alle in der Praxis berechenbaren Funktionen primitiv rekursiv. Die <a href=\"http:\/\/de.wikipedia.org\/wiki\/Isomorphie_von_Graphen\">Isomorphie von Graphen<\/a> ist z.B. in Exponentialzeit berechenbar, aber es ist noch nicht bewiesen ob es nicht einen effizienteren Algorithmus gibt.<\/p>\n<h2>Lernziel 5<\/h2>\n<p style=\"padding-left: 30px;\"><em>Definition der \\(\\mu\\)-rekursiven Funktionen<\/em><\/p>\n<p>Auch das haben wir bereits in einem Eintrag f\u00fcr die <a title=\"TI: Mue-Rekursion und WHILE\/LOOP-Berechenbarkeit (Update)\" href=\"https:\/\/fernuni.digreb.net\/?p=635\">\\(\\mu\\)-rekursiven Funktionen<\/a> bereits behandelt. Wir fassen das nochmal in einem Merksatz zusammen:<\/p>\n<blockquote><p>Die ggf. partielle Funktionen (d.h. sie sind ggf. nicht \u00fcberall definiert: Beispiel Wurzelfunktion) \\(f\\) ist \\(\\mu\\)-rekursiv wenn sie mittels der Grundoperationen: Nachfolge-, null- und einstellige Funktion sowie durch wiederholtes Anwenden der Substitution, primitiver Rekursion und des \\(\\tilde{\\mu}\\)-Operators\u00a0abbilden l\u00e4sst.<\/p><\/blockquote>\n<p>Gemerkt? Die Totalit\u00e4t unserer Funktion \\(f\\) ist f\u00fcr die \\(\\mu\\)-Rekursion nun nicht mehr notwendig. Auch haben wir zus\u00e4tzlich zu den Grundoperationen, der Substitution und der primitiven Rekursion nun mit dem \\(\\mu\\)-Operator das Nullsetzen der Funktion mit drin.<\/p>\n<p><strong>Aber Achtung<\/strong>: der \\(\\mu\\)-Operator ist im Skript nur auf totalen Funktionen definiert. Bei partiellen Funktionen k\u00f6nnen wir in Endlosschleifen geraten, aus denen wir sonst nicht mehr herauskommen. Durch eine kleine Erweiterung k\u00f6nnen wir aber auch auf partiellen Funktionen arbeiten (siehe <a href=\"http:\/\/planetmath.org\/muoperator\">hier<\/a>). Ich schreibe dann sp\u00e4ter noch ein par Kleinigkeiten dazu sobald ich alle Kurseinheiten nochmal \u00fcberarbeite.<\/p>\n<p>Merke: w\u00e4hrend man die primitiv rekursiven Funktionen also in \\(WHILE\\)-Schleifen nachbilden kann, kann man \\(\\mu\\)-rekursiven Funktionen nur in \\(WHILE\\)-Schleifen und nicht in \\(LOOP\\)-Schleifen nachbilden. Das liegt daran, dass die Anzahl der Iterationen bei der primitiven Rekursion im Vorfeld bekannt ist (FOR 1 TO 5 DO X) und bei der \\(\\mu\\)-Rekursion (DO X WHILE i NOT 0) nicht. Dieses &#8222;Nullstellen&#8220; unserer Funktion besorgt uns der \\(\\mu\\)-Operator.<\/p>\n<p><strong>Update<\/strong>:\u00a0Ein ausf\u00fchrliches Beispiel mittels partieller Subtraktion zum Nullsetzen habe ich im oben verlinkten\u00a0<a href=\"https:\/\/fernuni.digreb.net\/?p=635\">Beitrag<\/a> zur \\(\\mu\\)-Rekursion selbst gebracht. Dort wurde gezeigt, wie man die \\(\\mu\\)-Rekursion anwendet um eine Funktion, die nicht mittels primitiver Rekursion (LOOP) berechenbar ist, als berechenbar nachzuweisen.<\/p>\n<p>Es stellt sich die Frage, warum der \\(\\mu\\)-Operator auf totalen Funktionen definiert ist und der\u00a0\\(\\tilde{\\mu}\\)-Operators auch auf partiellen Funktionen arbeiten kann.<\/p>\n<p><strong>Beispiel<\/strong> \\(f:\\subseteq\\mathbb{N}\\rightarrow\\mathbb{N}\\) mit \\(f(x)=\\sqrt{x}\\)\u00a0als \\(\\mu\\)-berechenbar nachweisen<\/p>\n<p style=\"padding-left: 30px;\">Was m\u00fcssen wir hier tun? Offensichtlich ist\u00a0\\(\\sqrt{x}\\) auf den nat\u00fcrlichen Zahlen partiell, denn\u00a0\\(\\sqrt{5}=div\\), da das Ergebnis keine nat\u00fcrliche Zahl ist. Wenn wir diese Funktion nun als \\(\\mu\\)-rekursiv nachweisen wollen, m\u00fcssen wir folgendes tun:<\/p>\n<p style=\"padding-left: 30px;\">Wir basteln uns durch &#8222;Nullsetzen&#8220; aus unserer Wurzelfunktion \\(f\\) eine neue Funktion \\(h\\), die uns in Abh\u00e4ngigkeit von \\(y\\) eine \\(0\\) ausgibt wenn\u00a0\\(\\sqrt{x}\\) korrekt berechnet wurde und ansonsten etwas anderes als eine \\(0\\) als Ergebnis hat. Kann die Berechnung nicht korrekt abgeschlossen werden, erh\u00f6ht \\(\\mu\\) auf \\(h\\) das \\(y\\) und l\u00e4uft ewig weiter.<\/p>\n<p style=\"padding-left: 30px;\">Sie darf aber kein undefiniertes Ergebnis bringen, da wir ansonsten mit dem n\u00e4chsten \\(y\\) nicht fortfahren k\u00f6nnten.\u00a0Das ist der Grund, warum der \\(\\mu\\)-Operator nur auf <strong>totalen Funktionen<\/strong> definiert ist. W\u00e4re die &#8222;nullgesetzte&#8220; Funktion \\(h\\) nicht total, h\u00e4tte das einen Abbruch zur Folge und unser \\(\\mu\\) w\u00fcrde uns nichts brauchbares liefern.<\/p>\n<p style=\"padding-left: 30px;\">Die aus daraus entstehende Funktion\u00a0\\(\\tilde{\\mu}(h)(x)\\) ist aber <strong>partiell<\/strong>. Denn wir bekommen das Ergebnis, die kleinste Nullstelle, nur dann wenn die Berechnung in Ordnung war. Ansonsten l\u00e4uft unser \\(\\mu\\) ja durch die Totalit\u00e4t von der &#8222;nullgesetzten&#8220; Funktion endlos weiter und wir kommen nie zum Stillstand.<\/p>\n<p style=\"padding-left: 30px;\">Formal ausgedr\u00fcckt w\u00e4re dies:<\/p>\n<p style=\"padding-left: 60px;\">\\(\\tilde{\\mu}(h)(x)=\\begin{cases}0\\text{ wenn }\\sqrt{x}\\text{ existiert}\\\\div\\text{ sonst}\\end{cases}\\)<\/p>\n<p style=\"padding-left: 30px;\">Damit ist\u00a0\\(\\tilde{\\mu}\\) partiell.<\/p>\n<p style=\"padding-left: 30px;\">PS: betrachtet\u00a0\\(\\tilde{\\mu}(h)(x)\\) bitte als &#8222;<em>Die aus \\(h\\) entstehende Funktion<\/em>&#8222;, d.h. als komplettes Gebilde und nicht als Funktion \\(\\tilde{\\mu}\\) auf \\(h\\) auf \\(x\\).<\/p>\n<p style=\"padding-left: 30px;\">Schaut euch, wie gesagt, noch einmal ein konkretes Beispiel zur <a href=\"https:\/\/fernuni.digreb.net\/?p=635\">partiellen Subtraktion hier an<\/a>. Dort seht Ihr auch, wie man eine Funktion nullsetzen kann.<\/p>\n<p><strong>Antwort zum Lernziel<\/strong>: die \\(\\mu\\)-rekursiven Funktionen k\u00f6nnen &#8211; im Gegensatz zu primitiv-rekursiven &#8211; auch partiell sein. Sie werden ebenfalls durch die gleichen Grundoperationen und Substitution und primitive Rekursion gebildet wie die primitiv rekursiven Funktionen.<\/p>\n<p>Durch den \\(\\mu\\)-Operator jedoch wird eine M\u00f6glichkeit geschaffen die Anzahl der Schleifendurchl\u00e4ufe, nicht von Anfang an festlegen zu m\u00fcssen (wie das bei der primitiven Rekursion der Fall ist), indem man die Funktion &#8222;Nullsetzt&#8220; und mit dem \\(\\mu\\)-Operator die erste Nullstelle sucht.<\/p>\n<p>Es gibt damit Funktionen, die mittels \\(WHILE\\)-Schleife implementierbar, aber nicht primitiv-rekursiv sind (Ackermann-Funktion z.B.). Die Klasse der implementierbaren Funktionen ist damit gr\u00f6\u00dfer als die Klasse der\u00a0primitiv-rekursiven Funktionen.<\/p>\n<h2>Lernziel 6<\/h2>\n<p style=\"padding-left: 30px;\"><em>Erl\u00e4uterung der Churchschen These<\/em><\/p>\n<p>Etwas Vorarbeit: es gibt zun\u00e4chst einen gro\u00dfen Unterschied zwischen maschinell berechenbar und Register-(und damit auch Turing-)berechenbar. Worin liegt der?<\/p>\n<p>Nehmen wir als Beispiel die\u00a0<a href=\"http:\/\/de.wikipedia.org\/wiki\/Ackermannfunktion\">Ackermann-Funktion<\/a>. Wir k\u00f6nnen sie implementieren und wissen daher, dass sie (\\(WHILE\\)-)berechenbar ist und mit einer Turing- oder Registermaschine berechnet werden kann.<\/p>\n<p>Wollt Ihr mal \\(Ackermann(10)\\) berechnen? Macht das mal. Und dann k\u00f6nnt Ihr hier weiterlesen. Okay, das war gemein: es gibt keinen Rechner, der gen\u00fcgend Speicher h\u00e4tte diese Zahl zu speichern. Ebenfalls w\u00fcrde selbst das Alter des Weltalls nicht ausreichen um einen Speicher mit dieser Zahl zu f\u00fcllen (Satz geklaut aus dem Skript).<\/p>\n<p>Vielleicht habt Ihr nun eine kleine Vorstellung, was den Unterschied ausmacht zwischen intuitiv berechenbar und maschinell-berechenbar.<\/p>\n<p>In der theoretischen Informatik ist uns diese &#8222;maschinelle Berechenbarkeit&#8220; aber nicht wirklich wichtig; wir k\u00fcmmern uns eher um die erste Eigenschaft: die intuitive Berechenbarkeit. Die Speicherkapazit\u00e4t und die Geschwindigkeit der Maschinen \u00e4ndert sich und es gibt immer mehr Funktionen, die maschinell berechnet werden k\u00f6nnen. Aber die (intuitiv) berechenbaren Funktionen \u00e4ndern sich nicht nicht. Sie k\u00f6nnen entweder berechnet werden, oder eben nicht.<\/p>\n<p>Kommen wir daher zur <a href=\"http:\/\/de.wikipedia.org\/wiki\/Church-Turing-These\">Churchschen These<\/a> selbst (aus der Wikipedia, die aber \u00a0etwas von der im Skript abweicht. Warum sage ich gleich):<\/p>\n<blockquote><p>Die Klasse der Turing-berechenbaren Funktionen stimmt mit der Klasse der intuitiv berechenbaren Funktionen \u00fcberein.<\/p><\/blockquote>\n<p>Wir erinnern uns an den Begriff der intuitiven Berechenbarkeit: es gibt einen Algorithmus f\u00fcr eine Funktion \\(f:\\subseteq X\\rightarrow Y\\), der die Funktion berechnet. Auch k\u00f6nnen wir uns auf einstellige Zahlenfunktionen \\(f:\\mathbb{N}\\rightarrow\\mathbb{N}\\)\u00a0beschr\u00e4nken, da wir Wortfunktionen mittels der Standardnummerierung in Zahlen codieren k\u00f6nnen und mehrstellige Zahlenfunktionen letztendlich durch die <a title=\"TI: Cantorsche Tupelfunktion (Update: Umkehrfunktion)\" href=\"https:\/\/fernuni.digreb.net\/?p=580\">Cantorsche Paarungsfunktion<\/a> in einstellige Zahlenfunktionen \u00fcberf\u00fchrt werden k\u00f6nnen. Wir betrachten also im Endeffekt nur noch die Einband-Turing- (Wortfunktionen) oder die Registermaschinen (Zahlenfunktionen).Aufgrund der \u00c4quivalenz beider Berechnungsmodelle k\u00f6nnen wir uns zudem aussuchen, was wir betrachten.<\/p>\n<p>Lange Rede, kurzer Sinn: um uns also nicht mit &#8222;maschinell&#8220; und &#8222;intuitiv&#8220; auseinandersetzen und den Begriff &#8222;maschinell&#8220; alle paar Jahre neu definieren zu m\u00fcssen,\u00a0setzen wir einfach &#8222;maschinell&#8220; mit &#8222;intuitiv&#8220; gleich. Und da wir mit Register- und Turing-Berechenbarkeit (durch die Standardnummerierung) ein \u00c4quivalentes Berechnungsmodell haben, k\u00f6nnen wir statt dem oben genannten Satz aus der Wikipedia, problemlos auch die Churchsche These aus dem Skript herleiten:<\/p>\n<blockquote><p>Die Register-berechenbaren Funktionen sind genau die maschinell berechenbaren Zahlenfunktionen.<\/p><\/blockquote>\n<p>Deutlich geworden?<\/p>\n<p>Die These bedeutet also nichts anderes, als dass man mit der Turing- oder Registermaschine alle intuitiv\/maschinell berechenbaren Funktionen berechnen kann. Sie ist zwar nicht beweisbar, da wir den Begriff &#8222;intuitiv berechenbar&#8220; nicht exakt formulieren k\u00f6nnen, sie wird aber allgemein akzeptiert.<\/p>\n<p>Gelingt es uns ein Computermodell anzugeben, dass Funktionen berechnen kann, die mit der Turingmaschine nicht berechnet werden k\u00f6nnen, so k\u00f6nnten wir die These widerlegen (Ihr wisst, also was zu tun ist!).<\/p>\n<p>Noch ein paar Hintergrund-Details:<\/p>\n<p>Es ist noch niemandem gelungen eine maschinell-berechenbare Funktion anzugeben, die nicht Turing\/Register-berechenbar ist, daher liegt der Schluss nahe, dass wir (ohne Ber\u00fccksichtigung der Faktoren wie Zeit und Speicher) sagen k\u00f6nnen, dass die maschinell-berechenbaren Funktionen wirklich genau die intuitiv Register\/Turing-berechenbaren Funktionen sind.<\/p>\n<p><strong>Antwort zum Lernziel<\/strong>: Die Churchsche These besagt, dass alle intuitiv bzw. maschinell berechenbaren Funktionen genau die Turing- bzw. Register-berechenbaren Funktionen sind. Sie ist aufgrund des fehlenden Formalismus des Begriffs &#8222;intuitiv&#8220; nicht beweisbar, konnte aber auch nicht widerlegt werden.<\/p>\n<h2>Lernziel 7<\/h2>\n<p style=\"padding-left: 30px;\"><em>Beweis der Existenz von nicht-berechenbaren Funktionen durch Diagonalisierung<\/em><\/p>\n<p><span style=\"font-size: 13px;\">Wir rekapitulieren auch hier (im Beitrag \u00fcber <\/span><a style=\"font-size: 13px;\" href=\"https:\/\/fernuni.digreb.net\/?p=909\">Entscheidbarkeit<\/a><span style=\"font-size: 13px;\"> k\u00f6nnt ihr euer Wissen dar\u00fcber auffrischen): eine Menge ist entscheidbar (d.h. rekursiv) wenn f\u00fcr jede Eingabe aus der Definitionsmenge entschieden werden kann, ob sie eine Eigenschaft besitzt oder nicht. Formal ausgedr\u00fcckt:<\/span><\/p>\n<blockquote><p>Entscheidbar\/rekursiv: eine Menge hei\u00dft entscheidbar falls die charakteristische Funktion berechenbar ist.<\/p><\/blockquote>\n<p>Ich wiederhole hier aus dem oben verlinkten Beitrag die formale Definition:<\/p>\n<blockquote><p>Eine Menge \\( T \\subseteq M\\) ist\u00a0<strong>entscheidbar\/rekursiv<\/strong>\u00a0wenn die charakteristische Funktion \\(\\chi_T: M \\rightarrow \\{0,1\\}\\) definiert durch<\/p>\n\\(\\chi_T(t)=\\begin{cases} 1, &amp; \\mbox{ falls } t \\in T \\\\ 0, &amp; \\mbox{ sonst}\\end{cases}\\)\n<p>berechenbar ist (Achtung: sie muss berechenbar sein!)<\/p><\/blockquote>\n<p>Wir haben also eine definitive Aussage zu einer Eigenschaft eines Elements: wir k\u00f6nnen f\u00fcr jedes Element entscheiden ob es diese Eigenschaft besitzt oder nicht.<\/p>\n<p>Was w\u00e4re so eine entscheidbare Eigenschaft? Die Entscheidung ob eine Zahl \\(x\\) eine Primzahl ist oder nicht w\u00e4re entscheidbar.<\/p>\n<p>Den Begriff der Entscheidbarkeit haben wir aber nur f\u00fcr Mengen definiert. Wir interessieren uns hier aber f\u00fcr Funktionen und wollen zeigen, dass es Funktionen gibt, die nicht berechenbar sind. Wir gehen im Prinzip genauso vor, wie Cantor das in seinem <a href=\"http:\/\/de.wikipedia.org\/wiki\/Cantors_zweites_Diagonalargument\">zweiten Diagonalisierungsbeweis<\/a> getan hat. Im Beitrag \u00fcber\u00a0<a href=\"https:\/\/fernuni.digreb.net\/?p=909\">Entscheidbarkeit<\/a>\u00a0bekommt Ihr einen Einblick \u00fcber diese Beweismethode am Beispiel der M\u00e4chtigkeit von reellen und nat\u00fcrlichen Zahlen.<\/p>\n<p>Aber wollen wir den Beweis aus dem Skript mal Schritt f\u00fcr Schritt durchgehen und die Diagonalisierung nicht auf Mengen, sondern auf Funktionen anwenden. Was haben wir vor? Wir wollen zeigen, dass es nicht-berechenbare Funktionen gibt. Und so gehen wir dazu vor:<\/p>\n<p style=\"padding-left: 30px;\">1. Zun\u00e4chst definieren wir uns eine <a href=\"https:\/\/de.wikipedia.org\/wiki\/Surjektivit%C3%A4t\">surjektive<\/a>\u00a0Funktion\u00a0\\(\\psi\\) mit \\(\\psi:\\mathbb{N}\\rightarrow P^{(1)}\\).Was sie genau macht, zeigen wir gleich.<\/p>\n<p style=\"padding-left: 30px;\">2. \\(\\Gamma\\) ist das Alphabet der \\(WHILE\\)-Programme, w\u00e4hrend \\(WP\\subseteq\\Gamma^{*}\\) dann die Menge aller \\(WHILE\\)-Programme ist. Kann es \u00fcber \\(\\Gamma\\) auch &#8222;Nicht-\\(WHILE\\)-Programme geben? Sicher: irgendwelches Kauderwelsch, dass aus den Zeichen des Alphabets \\(\\Gamma\\) besteht.<\/p>\n<p style=\"padding-left: 30px;\">3. Wir Standard-nummerieren auch \\(\\Gamma^{*}\\) mit \\(\\nu_\\Gamma\\), diese ist also bijektiv. Alle Worte \u00fcber \\(\\Gamma\\) haben also eine eindeutige Nummer. Bereits jetzt haben wir das Gef\u00fchl, dass in der Menge \\(WP\\) weniger drin ist, als in der Menge \\(\\Gamma^{*}\\). Aber langsam.<\/p>\n<p>Was haben wir bis jetzt? Die Nummerierung aller Worte \u00fcber unserem Alphabet \\(\\Gamma\\) mit \\(\\nu_\\Gamma\\). Hier ist das Spannende, dass selbstverst\u00e4ndlich nicht alle Worte \u00fcber \\(\\Gamma\\) ein \\(WHILE\\)-Programm sind (siehe Punkt 2). Es kann auch irgendwelches Kauderwelsch sein. Die Menge der \\(WHILE\\)-Programme \\(WP\\) ist damit eine Teilmenge der Worte \u00fcber \\(\\Gamma\\): \\(WP\\subseteq\\Gamma^{*}\\).<\/p>\n<p>Und wir haben eine &#8222;Nummerierung&#8220; der\u00a0ggf. partiell einstelligen, berechenbaren Funktionen \\(f\\in{P^{(1)}}\\) mittels \\(\\psi\\).<\/p>\n<p>W\u00e4hrend wir \\(WHILE\\)-Programme mit der Eingabe f\u00fcr Registermaschinen (d.h. unsere Registerbelegung) f\u00fcttern, f\u00fcttern wir Funktionen einfach nur mit einem Eingabewert. Ist \\(P\\) unser \\(WHILE\\)-Programm, so bezeichnet \\(AC(\\tau(P)(EC(x)))\\) die von \\(P\\) berechnete Zahlenfunktion.<\/p>\n<p>Schon wieder diese Kompositionen. Am besten wir k\u00fcmmern uns direkt um ein<\/p>\n<p><strong>Beispiel<\/strong>: \\(f(x)=x+5\\)<\/p>\n<p style=\"padding-left: 30px;\">Diese Funktion \\(f\\in P^{(1)}\\) addiert zu einem Eingabewert \\(x\\) einfach nur eine \\(5\\). Das folgende \\(WHILE\\)-Programm \\(W\\in{WP}\\) tut dies ebenfalls:<\/p>\n<pre style=\"padding-left: 30px;\">i=5;\n\nWHILE \\(i\\neq 0\\) DO<\/pre>\n<pre style=\"padding-left: 30px;\">\u00a0 \u00a0x=x+1;<\/pre>\n<pre style=\"padding-left: 30px;\">\u00a0 \u00a0i=i-1;<\/pre>\n<pre style=\"padding-left: 30px;\">END;<\/pre>\n<p style=\"padding-left: 30px;\">Da die \\(WHILE\\)-Programme mittels Register- oder Turingmaschinen definiert werden, brauchen wir ein passendes Flussdiagramm \\(F\\):<\/p>\n<p style=\"padding-left: 30px; text-align: center;\"><a href=\"https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2012\/11\/ke4_wp.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-2234\" style=\"margin-left: 0px; margin-right: 50px;\" alt=\"ke4_wp\" src=\"https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2012\/11\/ke4_wp.png\" width=\"503\" height=\"164\" srcset=\"https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2012\/11\/ke4_wp.png 839w, https:\/\/fernuni.digreb.net\/wp-content\/uploads\/2012\/11\/ke4_wp-300x97.png 300w\" sizes=\"auto, (max-width: 503px) 100vw, 503px\" \/><\/a><\/p>\n<p style=\"padding-left: 30px;\">Seht Ihr das Problem?<\/p>\n<p style=\"padding-left: 30px;\">Das \\(WHILE\\)-Programm \\(W\\) k\u00f6nnen wir nicht einfach mit unserem Funktions-Eingabeparameter \\(x\\), f\u00fcttern, sondern brauchen eine Registerbelegung \\((R_0,R_1,&#8230;)\\). Was tun? Unsere Eingabecodierung bem\u00fchen, die wir bereits kennen.\u00a0Wir definieren:<\/p>\n<p style=\"padding-left: 60px;\">\\(EC(x)=(0,x)\\)<\/p>\n<p style=\"padding-left: 60px;\">(nicht vergessen, das 1. Register \\(R_0\\) bleibt leer, da es unser Ausgaberegister ist).<\/p>\n<p style=\"padding-left: 30px;\">Soweit so gut. Wir starten unser \\(WHILE\\)-Programm \\(W\\) nun mit \\(W(EC(x))=W((0,x))\\) und bekommen als Ausgabe \\(W(0,x)=(x+5,x,0)\\). Auch hier ist die Ausgabe des Flussdiagramms nicht der Ausgabewert, den wir bei der Funktion \\(f\\) erwarten!<\/p>\n<p style=\"padding-left: 30px;\">Ihr ahnt es sicherlich schon: wir brauchen eine Ausgabecodierung und definieren:<\/p>\n<p style=\"padding-left: 60px;\">\\(AC(d_0,d_1,d_2)=d_0\\)<\/p>\n<p style=\"padding-left: 60px;\">F\u00fcr uns ist also nur das 1. Register spannend.<\/p>\n<p style=\"padding-left: 30px;\">Und wenn wir uns die Definition von \\(\\tau(W)\\) (damit wird die von \\(W\\) berechnete Funktion bezeichnet) vor Augen f\u00fchren, erschlie\u00dft sich auch direkt unser\u00a0\\(AC(\\tau(W)(EC(x)))\\). Lassen wir es mal mit \\(x=5\\) laufen:<\/p>\n<p style=\"padding-left: 30px;\">\\(\\begin{array}{}AC(\\tau(W)(EC(5)))&amp;=AC(\\tau(W)(0,5))\\\\&amp;=AC(10,5,0)\\\\&amp;=10\\end{array}\\)<\/p>\n<p style=\"padding-left: 30px;\">Done!<\/p>\n<p>Nennen wir also\u00a0\\(AC(\\tau(W)(EC(x)))\\) die von \\(W\\) berechnete, einstellige Zahlenfunktion.<\/p>\n<p>F\u00fcr unser Vorgaben brauchen wir noch eins: \\(Z:\\mathbb{N}\\rightarrow\\mathbb{N}\\), unsere Nullfunktion. Egal, was wir da rein werfen, wir bekommen immer eine \\(0\\) heraus: \\(Z(n)=0\\) f\u00fcr alle \\(n\\).<\/p>\n<p>Jetzt sind wir ger\u00fcstet um \\(\\psi\\) f\u00fcr unser Vorhaben zu definieren:<\/p>\n\\(\\psi(i):=\\begin{cases}AC(\\tau(W)(EC(x)))&amp;\\text{ falls }\\nu_\\Gamma(i)\\in{WP}\\\\Z&amp;\\text{ sonst}\\end{cases}\\)\n<p>Ist ein \\(i\\) eine Nummer eines legitimen \\(WHILE\\)-Programms, d.h. es gilt \\(\\nu_\\Gamma(i)\\in{WP}\\), so berechnet dieses \\(WHILE\\)-Programm nat\u00fcrlich auch etwas: irgendeine Funktion aus \\(P^{(1)}\\). Ihre Ausgabe ist (wie wir oben gesehen haben) ja genau \\(AC(\\tau(W)(EC(x)))\\).\u00a0Und das ist dann unser \\(\\psi(i)\\).<\/p>\n<p>Es kann aber auch Nummern geben, die nicht zu einem \\(WHILE\\)-Programm geh\u00f6ren (unser oben genanntes Kauderwelsch). Da Kauderwelsch nichts berechnen kann, haben wir auch keine Ausgabe. Wir brauchen aber f\u00fcr unseren Beweis in jedem Fall eine und definieren in diesem Fall einfach, dass wir mit unserer Nullfunktion \\(Z\\) eine bekommen.<\/p>\n<p>Durch die Surjektivit\u00e4t von \\(\\psi\\) hat jede Funktion aus\u00a0\\(P^{(1)}\\) eine zugeh\u00f6rige Zahl und es m\u00fcsste also auch f\u00fcr die folgende Funktion \\(g\\) eine Zahl \\(i\\) geben:<\/p>\n\\(g(i):=\\begin{cases}1&amp;\\text{ falls }\\psi(i)(i)=0\\\\0&amp;\\text{ sonst}\\end{cases}\\)\n<p>Was ist \\(\\psi(i)(i)\\)? Ganz einfach: \\(\\psi(i)\\) ist die von \\(W\\) berechnete, einstellige Zahlenfunktion\u00a0\\(AC(\\tau(W)(EC(x)))\\) <strong>wenn<\/strong>\u00a0es ein richtiges \\(WHILE\\)-Programm und kein Kauderwelsch ist. Damit ist\u00a0\\(\\psi(i)(i)\\) einfach nur das \\(WHILE\\)-Programm mit der Nummer \\(i\\), welches als Eingabeparameter die Nummer \\(i\\) bekommt.<\/p>\n<p>Die Bedeutung erschlie\u00dft sich hier am besten auch an einem<\/p>\n<p><strong>Beispiel<\/strong>:<\/p>\n<p style=\"padding-left: 30px;\">Nehmen wir an, das obige \\(WHILE\\)-Programm \\(W\\) hat die willk\u00fcrliche Nummer \\(561\\). Da es ein echtes \\(WHILE\\)-Programm ist, gilt damit \\(\\nu_\\Gamma(561)\\in{WP}\\) und<\/p>\n<p style=\"padding-left: 60px;\">\\(\\begin{array}{}\\psi(561)&amp;=AC(\\tau(\\nu_\\Gamma(561))(EC(x)))\\\\&amp;=AC(\\tau(\\nu_\\Gamma(561))(0,x))\\\\&amp;=AC(x+5,5,0)\\\\&amp;=x+5\\end{array}\\)<\/p>\n<p style=\"padding-left: 30px;\">Und nun \u00fcbergeben wir \\(\\psi(561)\\) die \\(561\\) als Parameter:<\/p>\n<p style=\"padding-left: 60px;\">\\(\\begin{array}{}\\psi(561)(561)&amp;=AC(\\tau(\\nu_\\Gamma(561))(EC(561)))\\\\&amp;=AC(\\tau(\\nu_\\Gamma(561))(0,561))\\\\&amp;=AC(561+5,5,0)\\\\&amp;=566\\end{array}\\)<\/p>\n<p style=\"padding-left: 30px;\">Damit ist \\(\\psi(561)(561)=566\\).<\/p>\n<p style=\"padding-left: 30px;\">Und unser \\(g\\) w\u00e4re der obigen Definition nach \\(g(561)=0\\).<\/p>\n<p style=\"padding-left: 30px;\">Was w\u00fcrde passieren, wenn \\(W\\) kein \\(WHILE\\)-Programm w\u00e4re? D.h.\u00a0\\(\\nu_\\Gamma(561)\\notin{WP}\\)?<\/p>\n<p style=\"padding-left: 30px;\">Dann w\u00e4re\u00a0\\(\\psi(561)(n)=0\\) der Definition nach f\u00fcr jedes \\(n\\). Und \\(g\\)? \\(g\\) w\u00e4re:<\/p>\n<p style=\"padding-left: 30px;\">\\(g(561)=1\\).<\/p>\n<p>Wie wir an dem Beispiel erkennen, ist sichergestellt, dass \\(g\\) in jedem Fall einen anderen Funktionswert annimmt als \\(\\psi(i)\\) wenn beide Funktionen mit \\(i\\) gef\u00fcttert werden.<\/p>\n<p>D\u00e4mmert es euch bereits? Was ist denn \\(\\psi\\) nochmal? Das ist unsere &#8222;Nummerierung&#8220; aller einstelligen, berechenbaren Funktionen aus \\(P^{(1)}\\)! In \\(\\{\\psi(0),\\psi(1),&#8230;\\}\\) liegen sie alle drin. Und wo ist \\(g\\)? \\(g\\) geh\u00f6rt zweifelsohne auch in die Menge\u00a0aller einstelligen, berechenbaren Funktionen aus \\(P^{(1)}\\). Dann liegt es doch sicherlich auch irgendwo\u00a0\\(\\{\\psi(0),\\psi(1),&#8230;\\}\\), oder?<\/p>\n<p>Nein! \\(g\\) ist von jeder Funktion aus \\(\\{\\psi(0),\\psi(1),&#8230;\\}\\)\u00a0durch seine Definition, dass es immer einen anderen Wert bei \\(g(i)(i)\\) annimmt als \\(\\psi(i)(i)\\) verschieden, obwohl es definitiv zu \\(P^{(1)}\\) geh\u00f6rt. Widerspruch!<\/p>\n<p>&nbsp;<\/p>\n<p>Allgemein beweist man, dass Funktionen nicht berechenbar sind durch Widerspruchsbeweise. Im Skript wird dazu genau das gleiche Verfahren angewandt wie im zweiten Diagonalisierungsbeweis von Cantor: man geht von Vollst\u00e4ndigkeit aus, zeigt, dass man noch etwas hinzuf\u00fcgen kann, was sich auf jeden Fall von allen anderen Eintr\u00e4gen unterscheidet (bei Diagonalisierungsbeweisen wird das Diagonalelement eines Eintrags f\u00fcr den neuen Eintrag abge\u00e4ndert und ver\u00e4ndert, so dass beide Eintr\u00e4ge mindestens an der abge\u00e4nderten Stelle unterschiedlich sind) und st\u00f6\u00dft so auf einen Widerspruch.<\/p>\n<p>Damit haben wir eine Funktion definiert, die offensichtlich nicht berechnet werden kann. Es folgt: \\(g\\notin{P^{(1)}}\\).<\/p>\n<p><strong>Antwort zum Lernziel<\/strong>: die Angabe einer nicht berechenbaren Funktion gelingt durch Widerspruchsbeweis mittels Diagonalisierung, \u00e4hnlich dem Verfahren, das\u00a0<a href=\"https:\/\/de.wikipedia.org\/wiki\/Georg_Cantor\">Georg Cantor<\/a> bereits f\u00fcr sein <a href=\"https:\/\/de.wikipedia.org\/wiki\/Cantors_zweites_Diagonalargument\">zweites Diagonalargument<\/a> angewendet hat um die \u00dcberabz\u00e4hlbarkeit der reellen Zahlen zu beweisen.<\/p>\n<p>Dazu wird angenommen, man habe alle berechenbaren Funktionen aufgelistet und zeigt, dass es eine weitere Funktion gibt, die sich definitiv von allen anderen Funktionen unterscheidet. Woraus folgt, dass diese nicht berechenbar sein kann. Zumindest nicht wenn wir Berechenbarkeit mit dem \u00fcblichen Begriff f\u00fcr Berechenbarkeit, der Register- und\/oder Turing-Berechenbarkeit gleichsetzen.<\/p>\n<p>Das war viel Stoff. Sicherlich sind irgendwo noch Ungenauigkeiten drin oder es haben sich evtl. auch Fehler eingeschlichen. \u00dcber Hinweise in den Kommentaren w\u00fcrde ich mich freuen.<br \/>\nDone!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Update:\u00a0ich modelliere auch diesen Beitrag auf die Lernziele um. Evtl. kann es sein, dass der Beitrag nicht ganz fertig wird, so dass ein paar Antworten (noch) leer sind. Da ich ihn aber nicht speichern kann ohne ihn zu aktualisieren oder ihn offline nehmen m\u00fcsste, habe ich keine andere Wahl als das zun\u00e4chst so zu handhaben. &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/fernuni.digreb.net\/?p=837\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eTIA: Berechenbarkeit (Lernziele aus KE4, Update 6)\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-837","post","type-post","status-publish","format-standard","hentry","category-theoretische-informatik"],"_links":{"self":[{"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=\/wp\/v2\/posts\/837","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=837"}],"version-history":[{"count":68,"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=\/wp\/v2\/posts\/837\/revisions"}],"predecessor-version":[{"id":3510,"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=\/wp\/v2\/posts\/837\/revisions\/3510"}],"wp:attachment":[{"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=837"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=837"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fernuni.digreb.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=837"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}