<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>Zufallsbit - Informatik</title>
    <link>http://zufallsbit.de/blog/</link>
    <description>...weil 0 und 1 manchmal ausreichen</description>
    <dc:language>de</dc:language>
    <generator>Serendipity 1.5.3 - http://www.s9y.org/</generator>
    <pubDate>Wed, 25 Feb 2009 14:41:30 GMT</pubDate>

    <image>
        <url>http://zufallsbit.de/blog/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: Zufallsbit - Informatik - ...weil 0 und 1 manchmal ausreichen</title>
        <link>http://zufallsbit.de/blog/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>Datenbanks-Meinungsupdate</title>
    <link>http://zufallsbit.de/blog/index.php?/archives/254-Datenbanks-Meinungsupdate.html</link>
            <category>Informatik</category>
    
    <comments>http://zufallsbit.de/blog/index.php?/archives/254-Datenbanks-Meinungsupdate.html#comments</comments>
    <wfw:comment>http://zufallsbit.de/blog/wfwcomment.php?cid=254</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://zufallsbit.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=254</wfw:commentRss>
    

    <author>nospam@example.com (Turing)</author>
    <content:encoded>
    &lt;p&gt;Meine Erfahrungen mit Datenbanken beschränken sich auf die für Informatiker üblichen: Ein gutes dutzend privater Projekte, wo man mal eine Datenbank benutzt (Django, Rails etc). Intensive Nutzung diverser Programme, die Datenbanken benutzen (Amarok, mythtv). Und natürlich die unvermeidliche Datenbank-Vorlesung.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;In der echten Welt, da wo man tatsächlich professionelle Anwendungen baut, hatte ich bisher keine Erfahrungen. In meinem aktuellen Job musste ich mich in den letzten Wochen intensiv mit gleich fünf verschiedenen Produkten auseinandersetzen. Dabei handelt es sich um Views und Select-Statements mit einer zweistelligen Anzahl von Substatements und Zeilen, eine durchaus anspruchsvolle Aufgabe für die Programme also. Ohne ins Details zu gehen, hier ist was ich gelernt habe:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
PostgreSQL - Hat mich positiv überrascht. Laut der aktuellen iX kommen bald noch ein paar spannende Features dazu.&lt;br/&gt;&lt;br /&gt;
Paradox - Okay, das Ding ist wirklich alt, entsprechend schlecht ist mein Eindruck.&lt;br/&gt;&lt;br /&gt;
Informix - Irgendwie ist Informix ziemlich gut, aber es gibt gewisse, seltene Fälle wo ein einfaches &quot;WHERE x.id=y.id&quot; die Laufzeit von Sekunden auf eine halbe Stunde erhöht. Dazu fehlen einige wichtige Funktionen wie MAX(). Irgendwie fühlt sich Informix nicht professionell an, obwohl es von IBM gerne so bezeichnet wird.&lt;/br&gt;&lt;br /&gt;
mysql - Werde ich ab jetzt so gut wie möglich vermeiden. Die Laufzeiten und vor allem die CPU-Auslastung ist für kompliziertere Statements lächerlich. Ich war bis jetzt ganz zufrieden mit mysql, aber jetzt wo ich aus erster Hand gesehen habe, wie groß der Unterschied zu professionellen System ist, ist meine Liebe verflogen.&lt;/br&gt;&lt;br /&gt;
Oracle - Wow. Ich konnte keine einzige Schwäche feststellen, bis auf die umständliche Installation und der blöden Patchpolitik.&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Ab jetzt Postgre für private Projekte, Oracle für professionelle.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 24 Feb 2009 15:56:53 +0100</pubDate>
    <guid isPermaLink="false">http://zufallsbit.de/blog/index.php?/archives/254-guid.html</guid>
    
</item>
<item>
    <title>Multitouch at work</title>
    <link>http://zufallsbit.de/blog/index.php?/archives/240-Multitouch-at-work.html</link>
            <category>Games</category>
            <category>Informatik</category>
    
    <comments>http://zufallsbit.de/blog/index.php?/archives/240-Multitouch-at-work.html#comments</comments>
    <wfw:comment>http://zufallsbit.de/blog/wfwcomment.php?cid=240</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://zufallsbit.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=240</wfw:commentRss>
    

    <author>nospam@example.com (Turing)</author>
    <content:encoded>
    &lt;p&gt;&lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/castingknights.de/cn/2008/10/30/und-weil-es-so-schon-war/&#039;);&quot;  href=&quot;http://castingknights.de/cn/2008/10/30/und-weil-es-so-schon-war/&quot;&gt;Äußerst cool&lt;/a&gt;: Mein Bruder und sein Kollege Ali benutzen ihr selbstentwickeltes Multitouch um Spiele zu spielen. Wenn das mal kein &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.nerdcore.de/wp/2008/08/05/minority-report-in-echt-riesiges-hologram-multitouch-dings/&#039;);&quot;  href=&quot;http://www.nerdcore.de/wp/2008/08/05/minority-report-in-echt-riesiges-hologram-multitouch-dings/&quot;&gt;René-würdiges&lt;/a&gt; Gadget ist.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 31 Oct 2008 08:31:55 +0100</pubDate>
    <guid isPermaLink="false">http://zufallsbit.de/blog/index.php?/archives/240-guid.html</guid>
    
</item>
<item>
    <title>Mal ein bisschen Spieltheorie</title>
    <link>http://zufallsbit.de/blog/index.php?/archives/237-Mal-ein-bisschen-Spieltheorie.html</link>
            <category>Informatik</category>
    
    <comments>http://zufallsbit.de/blog/index.php?/archives/237-Mal-ein-bisschen-Spieltheorie.html#comments</comments>
    <wfw:comment>http://zufallsbit.de/blog/wfwcomment.php?cid=237</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://zufallsbit.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=237</wfw:commentRss>
    

    <author>nospam@example.com (Turing)</author>
    <content:encoded>
    &lt;p&gt;Dieses Blog braucht dringend mehr Input. Das meiste was ich zu erzählen hätte, bräuchte leider eine längere Vorbereitung, scheitert aus Zeitgründen oder interessiert schlicht kein Schwein. Einen kleinen (für mich) interessanten Fakt aus der Spieltheorie habe ich aber doch loszuwerden.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Wenn wir von einem nicht kooperativem Zwei-Personen-Spiel mit perfekter Information reden, ist ein Spiel gemeint, wo zwei Spieler jeweils alle Züge des Spielers sehen können. Schach ist zum Beispiel ein Spiel mit perfekter Information, Poker dafür nicht. Bei kooperativen Spielen können sich Spieler untereinander absprechen, um vielleicht einen Vorteil für beide Spieler zu erwirken.&lt;/p&gt;&lt;p&gt; Eine weitere Eigenschaft von Zwei-Personen-Spielen ist, dass der Gewinn von Spieler A direkt der Verlust des Spielers B ist. Deshalb spricht man von einer &quot;Auszahlung&quot; am Ende eines Spiel, die positiv oder negativ sein kann. Eine Auszahlung von &quot;10&quot; würde bedeuten, Spieler A gewinnt 10, B verliert dafür 10. Umgekehrt gewinnt B bei Auszahlung &quot;-10&quot; und A verliert.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Nehmen wir mal ein Spiel an, das aus Anschaulichkeitsgründen so einfach wie möglich ist. Spieler A wählt einmal, Spieler B wählt danach und dann ist A noch einmal dran. Am Ende wartet irgendein Auszahlungsschema, das nicht besonders viel Sinn macht, aber ich bin ja auch kein Spieleerfinder. Konkret sieht das Spiel so aus, als Baum dargestellt:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;!-- s9ymdb:102 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;331&quot; height=&quot;506&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://zufallsbit.de/blog/uploads/sptheorie.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Ein Beispiel: Sagen wir A wählt im ersten Zug die 2, B wählt 1 und A wählt noch einmal 1. Damit hätte A &quot;2&quot; gewonnen. Ganz offensichtlich gibt es begrenzt viele Aktionen, die die Spieler überhaupt ausführen können. Jeden &quot;gesamten Spielablauf&quot; aus der Sicht eines einzelnen Spielers bezeichnet man als &quot;Strategie&quot;, zum Beispiel könnten wir es (2,2) nennen, wenn A im ersten und dritten Zug die &quot;2&quot; wählt. Zählen wir mal durch, wie viele Strategien A hat:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;A1: Wähle (1,1) unabhängig von B&#039;s Zug&lt;br/&gt;&lt;br /&gt;
A2: Wähle 1 und mache dann das Gegenteil von B&lt;br/&gt;&lt;br /&gt;
A3: Wähle 1 und mache das Gleiche wie B&lt;br/&gt;&lt;br /&gt;
A4: Wähle (1,2) unabhängig von B&#039;s Zug&lt;br/&gt;&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Außerdem gibt es natürlich weitere 4 Strategien, wenn A im ersten Zug 2 wählt. B hat weniger Strategien:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;br /&gt;
B1: Wähle 1 unabhängig von A&#039;s Zug&lt;br/&gt;&lt;br /&gt;
B2: Wähle 2 unabhängig von A&#039;s Zug&lt;br/&gt;&lt;br /&gt;
B3: Wähle das Gleiche wie A&lt;br/&gt;&lt;br /&gt;
B4: Wähle das Gegenteil von A&lt;br/&gt;&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Wenn man das alles jetzt &quot;normalisiert&quot; darstellt, schreibt man die Strategien an eine Matrix und schreibt an die Schnittstellen die Auszahlung. Ungefähr so:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;!-- s9ymdb:103 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;335&quot; height=&quot;197&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://zufallsbit.de/blog/uploads/sptheorie1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Als Beispiel: Sagen wir A wählt Strategie 3, B wählt 4. Damit zieht A &quot;1&quot;, B wählt das Gegenteil (wegen seiner Strategie), also 2. Die Strategie für A wiederum sagt, dass A jetzt 2 zieht. Damit ist die Auszahlung -1, was man in der Matrix bei A3xB4 wieder findet. Kleine Bemerkung am Rande: Dass die Matrix in diesem Fall so symmetrisch aussieht hat damit zu tun, dass das Spiel so extrem simpel ist. Schon wenn man für jeden Zug drei Wahlmöglichkeiten zulässt, sieht die Matrix schon deutlich anders aus. Allerdings steigt die Anzahl der Strategien dann auch deutlich und es wird schnell unübersichtlich.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Jetzt lassen sich ein paar interessante Beobachtungen anstellen. Zum Beispiel kann B nicht gewinnen, wenn A keinen groben Fehler macht. Egal, was B macht, immer kann A im letzten Zug zumindest ein Unentschieden sichern. Deshalb wäre die rationale Entscheidung für B, die Strategie B2 zu wählen. Denn wenn A 1 wählt, kommt B mit einer &quot;0&quot; raus, wann A am Anfang 2 zeiht, verliert B wenigstens nur mit einer 1. &lt;br /&gt; Auf der anderen Seite steht A vor der gleichen Entscheidung, denn er weiß, dass B nicht ganz blöd ist und z.B. auf &quot;1&quot; nicht wieder mit &quot;1&quot; antworten würde, weil A sonst mit 6 gewinnt. Damit ist es auch für A richtig, die 2 zu wählen und wenigstens den einen Punkt mitzunehmen, statt mit einer 1 nicht über Auszahlung 0 hinaus zu kommen.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Es ist spät geworden, und der Punkt auf den ich hinaus will, ist nicht mehr wahnsinnig weit entfernt, aber doch weit genug als bis zum Wochenende warten zu müssen. Immer unterschätze ich die Zeit, die ich dafür brauche, Bilder zu malen und Beispiele zu erfinden.&lt;p&gt; 
    </content:encoded>

    <pubDate>Fri, 24 Oct 2008 21:35:46 +0200</pubDate>
    <guid isPermaLink="false">http://zufallsbit.de/blog/index.php?/archives/237-guid.html</guid>
    <category>informatik</category>
<category>sattelpunkt</category>
<category>spiel</category>
<category>spieltheorie</category>
<category>strategie</category>

</item>
<item>
    <title>Kantenerkennung mit Sobel</title>
    <link>http://zufallsbit.de/blog/index.php?/archives/213-Kantenerkennung-mit-Sobel.html</link>
            <category>Informatik</category>
    
    <comments>http://zufallsbit.de/blog/index.php?/archives/213-Kantenerkennung-mit-Sobel.html#comments</comments>
    <wfw:comment>http://zufallsbit.de/blog/wfwcomment.php?cid=213</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://zufallsbit.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=213</wfw:commentRss>
    

    <author>nospam@example.com (Turing)</author>
    <content:encoded>
    &lt;p&gt;Eine beliebte Anwendung in der Bildverarbeitung ist die Kantenerkennung. Das kann man benutzen um automatisiert Dinge zu erkennen, zum Beispiel in Maschinen. Ein beliebtes Verfahren zur Kantenerkennung ist der Sobel-Operator. (Den ich letztens mal aus anderen Gründen implementieren musste, deshalb wird das hier jetzt auch verwurstet.)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Zu Demonstrationszwecken nehme ich mir einfach mal ein Bild von &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.flickr.com/photos/lellis_sjca/2630996439/&#039;);&quot;  href=&quot;http://www.flickr.com/photos/lellis_sjca/2630996439/&quot; title=&quot;Flickr&quot;&gt;Flickr&lt;/a&gt; von &quot;Linda&amp;Larry&quot;, das unter der CC Lizenz steht.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://zufallsbit.de/blog/uploads/example.jpg&#039;&gt;&lt;!-- s9ymdb:52 --&gt;&lt;img class=&quot;serendipity_image_left&quot; width=&quot;83&quot; height=&quot;110&quot; style=&quot;float: top; border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://zufallsbit.de/blog/uploads/example.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Das Bild wird jetzt mit einer Matrix &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/de.wikipedia.org/wiki/Faltung_(Mathematik)&#039;);&quot;  href=&quot;http://de.wikipedia.org/wiki/Faltung_(Mathematik)&quot;&gt;gefaltet&lt;/a&gt;, allerdings nicht ganz traditionell. Vielmehr wird die Matrix zentriert &quot;auf das Bild gelegt&quot;. Es geht konkret um diese beiden Matrizen:&lt;/p&gt; &lt;br /&gt;
&lt;p&gt;&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=S_x%3D%20%5C%5B%20%5Cleft%28%20%5Cbegin%7Barray%7D%7Bccc%7D1%20%26%200%20%26%20-1%20%5C%5C2%20%26%200%20%26%20-2%20%5C%5C1%20%26%200%20%26%20-1%20%5Cend%7Barray%7D%20%5Cright%29%5C%5D%20&quot; title=&quot;S_x= \[ \left( \begin{array}{ccc}1 &amp;amp; 0 &amp;amp; -1 \\2 &amp;amp; 0 &amp;amp; -2 \\1 &amp;amp; 0 &amp;amp; -1 \end{array} \right)\] &quot; alt=&quot;S_x= \[ \left( \begin{array}{ccc}1 &amp;amp; 0 &amp;amp; -1 \\2 &amp;amp; 0 &amp;amp; -2 \\1 &amp;amp; 0 &amp;amp; -1 \end{array} \right)\] &quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=S_y%3D%20%5C%5B%20%5Cleft%28%20%5Cbegin%7Barray%7D%7Bccc%7D1%20%26%202%20%26%201%20%5C%5C0%20%26%200%20%26%200%20%5C%5C-1%20%26%20-2%20%26%20-1%20%5Cend%7Barray%7D%20%5Cright%29%5C%5D%20&quot; title=&quot;S_y= \[ \left( \begin{array}{ccc}1 &amp;amp; 2 &amp;amp; 1 \\0 &amp;amp; 0 &amp;amp; 0 \\-1 &amp;amp; -2 &amp;amp; -1 \end{array} \right)\] &quot; alt=&quot;S_y= \[ \left( \begin{array}{ccc}1 &amp;amp; 2 &amp;amp; 1 \\0 &amp;amp; 0 &amp;amp; 0 \\-1 &amp;amp; -2 &amp;amp; -1 \end{array} \right)\] &quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Diese werden jetzt wie gesagt auf die Bilder &quot;gelegt&quot;. Nehmen wir mal der Einfachheit halber an, dass wir ein Schwarz-Weiß Bild haben, das bedeutet, dass jeder Pixel mit einem Grautonwert von 0-255 darstellbar ist. Nehmen wir weiter an, dass die Pixel oben links im Bild etwa so aussehen:&lt;br /&gt;&lt;br /&gt;
10 12 50&lt;br /&gt;&lt;br /&gt;
20 22 40&lt;br /&gt;&lt;br /&gt;
25 30 40&lt;br /&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
Um den neuen Wert des Pixels in der Mitte zu berechnen (die 22) wird der obere linke Wert von &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=S_x&quot; title=&quot;S_x&quot; alt=&quot;S_x&quot; \/&gt; mit dem Pixel oben links von der 22 multipliziert. Entsprechend wird das mit allen anderen Pixeln drumherum gemacht und der neue Wert für die 22 ist dann die Addition aller dieser Werte. In diesem Fall &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=1%5Ccdot%2010%2B0-1%5Ccdot%2050%2B2%5Ccdot%2020%20%2B0-2%5Ccdot%2040%2B1%5Ccdot%2025%2B0-1%5Ccdot%2040%3D-95&quot; title=&quot;1\cdot 10+0-1\cdot 50+2\cdot 20 +0-2\cdot 40+1\cdot 25+0-1\cdot 40=-95&quot; alt=&quot;1\cdot 10+0-1\cdot 50+2\cdot 20 +0-2\cdot 40+1\cdot 25+0-1\cdot 40=-95&quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Das ganze kann natürlich Werte &gt;255 produzieren, aber auch, wie hier, negative Werte. Deshalb muss das ganze normalisiert werden. Dazu müssen wir die maximalen und minimalen Werte des Bildes berechnen und den Pixel &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=g_%7Bij%7D&quot; title=&quot;g_{ij}&quot; alt=&quot;g_{ij}&quot; \/&gt; danach nach der Formel &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=255%5Cfrac%7Bg_%7Bij%7D-min%7D%7Bmax-min%7D&quot; title=&quot;255\frac{g_{ij}-min}{max-min}&quot; alt=&quot;255\frac{g_{ij}-min}{max-min}&quot; \/&gt; bearbeiten. Und wenn man diese ganze Prozedur für alle Pixel macht, haben wir zwei darstellbare Bilder. Das mit &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=S_x&quot; title=&quot;S_x&quot; alt=&quot;S_x&quot; \/&gt; gefaltete hat besonders große Werte, wenn der Farbunterschied links und rechts vom bearbeiteten Pixel besonders groß ist. &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=S_y&quot; title=&quot;S_y&quot; alt=&quot;S_y&quot; \/&gt; macht das gleiche in y-Richtung&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Die beiden resultierenden Bilder sehen dann so aus:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://zufallsbit.de/blog/uploads/gx.jpg&#039;&gt;&lt;!-- s9ymdb:53 --&gt;&lt;img class=&quot;serendipity_image_left&quot; width=&quot;83&quot; height=&quot;110&quot; style=&quot;float: left; border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://zufallsbit.de/blog/uploads/gx.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://zufallsbit.de/blog/uploads/gy.jpg&#039;&gt;&lt;!-- s9ymdb:54 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;83&quot; height=&quot;110&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://zufallsbit.de/blog/uploads/gy.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Wie man sieht, haben die beiden Bilder so eine Art &quot;Richtung&quot;. Um daraus jetzt ein einziges Kantenbild zu machen, kombiniert man diese beiden Bilder mit der Formel &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=g_%7Bij%7D%3D%5Csqrt%7B%28g_%7Bij%7D%5Ex%29%5E2%2B%28g_%7Bij%7D%5Ey%29%5E2%7D&quot; title=&quot;g_{ij}=\sqrt{(g_{ij}^x)^2+(g_{ij}^y)^2}&quot; alt=&quot;g_{ij}=\sqrt{(g_{ij}^x)^2+(g_{ij}^y)^2}&quot; \/&gt;. Von beiden Bildern wird also jeweils der gleiche Pixel genommen, quadriert, addiert und wurzelifiziert. Als letzter Schritt wird jetzt nur noch eine Schwellenwertfunktion angewandt. Man will ja scharfe Kanten haben, also wird das Endbild noch einmal durch gegangen und jeder Pixel wird mit dieser Funktion behandelt:&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=e_%7Bij%7D%3D%20%5Cbegin%7Bcases%7D255%26%5Ctext%7Bwenn%20%7D%20g_%7Bij%7D%3E%20127%5C%5C0%26%5Ctext%7Bsonst%20%7D%20%5Cend%7Bcases%7D&quot; title=&quot;e_{ij}= \begin{cases}255&amp;\text{wenn } g_{ij}&gt; 127\\0&amp;\text{sonst } \end{cases}&quot; alt=&quot;e_{ij}= \begin{cases}255&amp;\text{wenn } g_{ij}&gt; 127\\0&amp;\text{sonst } \end{cases}&quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Und dann kommt dieses Kantenbild heraus:&lt;a class=&#039;serendipity_image_link&#039; href=&#039;http://zufallsbit.de/blog/uploads/sobel.jpg&#039;&gt;&lt;!-- s9ymdb:55 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;83&quot; height=&quot;110&quot; style=&quot;border: 0px; padding-left: 5px; padding-right: 5px;&quot; src=&quot;http://zufallsbit.de/blog/uploads/sobel.serendipityThumb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
So einfach funktioniert also im Grunde Kantenerkennung. Meine Implementierung ist leider nicht präsentierbar, und auch alles andere als schnell (Python). Wenn es tatsächlich jemand brauchen kann, schreibt er mir bitte eine Mail.  &lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 20 Jul 2008 09:49:48 +0200</pubDate>
    <guid isPermaLink="false">http://zufallsbit.de/blog/index.php?/archives/213-guid.html</guid>
    
</item>
<item>
    <title>Das Halteproblem</title>
    <link>http://zufallsbit.de/blog/index.php?/archives/142-Das-Halteproblem.html</link>
            <category>Informatik</category>
    
    <comments>http://zufallsbit.de/blog/index.php?/archives/142-Das-Halteproblem.html#comments</comments>
    <wfw:comment>http://zufallsbit.de/blog/wfwcomment.php?cid=142</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://zufallsbit.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=142</wfw:commentRss>
    

    <author>nospam@example.com (Turing)</author>
    <content:encoded>
    &lt;br /&gt;
Mit frischer Motivation wegen des neuen Servers ausgestattet kommt heute die Serie über Entscheidbarkeitstheorie zu Ende. Viel ist es jetzt nicht mehr, keine Sorge. Bis jetzt haben wir gesehen, dass die Diagonalsprache &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=D%3D%20%5C%7Bw_i%7C%5C%20M_i%5C%20akzeptiert%5C%20w_i%5C%20nicht%5C%20%5C%7D&quot; title=&quot;D= \{w_i|\ M_i\ akzeptiert\ w_i\ nicht\ \}&quot; alt=&quot;D= \{w_i|\ M_i\ akzeptiert\ w_i\ nicht\ \}&quot; \/&gt; alles andere als entscheidbar ist.&lt;br /&gt;Daraus lässt sich jetzt trivial etwas über das Komplement der Diagonalsprache &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Coverline%7BD%7D%3D%5C%7Bw_i%7C%5C%20M_i%5C%20akzeptiert%5C%20w_i%5C%20%5C%7D&quot; title=&quot;\overline{D}=\{w_i|\ M_i\ akzeptiert\ w_i\ \}&quot; alt=&quot;\overline{D}=\{w_i|\ M_i\ akzeptiert\ w_i\ \}&quot; \/&gt; folgern. Wenn ich nämlich annehme, dass es eine TM gibt, die die Sprache entscheidet, dann kann ich auch eine TM bauen, die die Sprache entscheidet und das Ergebnis umdreht. Dann hätte ich aber eine TM für D gefunden, und die kann es nicht geben, also ist schon die hypothetische TM für &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Coverline%7BD%7D&quot; title=&quot;\overline{D}&quot; alt=&quot;\overline{D}&quot; \/&gt; unmöglich. Rekursiv aufzählbar ist &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Coverline%7BD%7D&quot; title=&quot;\overline{D}&quot; alt=&quot;\overline{D}&quot; \/&gt; im Gegensatz zu D allerdings schon. Man sucht einfach für das Eingabewort die zugehörige TM (also die TM, deren Gödelnummer in der Tabelle aus dem letzten Beitrag zum Wort gehört) und lässt eine UTM entscheiden. Das geht in diesem Fall, weil die UTM keinen Fehler machen würde, wenn sie „1“ sagt. Das war ja genau der Widerspruch, der D nicht rekursiv hat werden lassen. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Und jetzt können wir endlich das Halteproblem bearbeiten. Die Definition ist folgende: &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=H%3D%5C%20%5C%7B%26lt%3BM%26gt%3Bw%5C%20%7C%5C%20M%5C%20h%5C%26quot%3B%7Ba%7Dlt%5C%20auf%5C%20w%5C%7D&quot; title=&quot;H=\ \{&amp;lt;M&amp;gt;w\ |\ M\ h\&amp;quot;{a}lt\ auf\ w\}&quot; alt=&quot;H=\ \{&amp;lt;M&amp;gt;w\ |\ M\ h\&amp;quot;{a}lt\ auf\ w\}&quot; \/&gt;.&lt;/p&gt;&lt;p&gt;Die Eingabe ist also eine beliebige Gödelnummer kombiniert mit einer beliebigen Eingabe. Die TM für H soll entscheiden, ob die Gödelnummer auf der angegebenen Eingabe hält. Die Beweistechnik ist die selbe wie vorher. Wir erfinden einen Algorithmus, der &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Coverline%7BD%7D&quot; title=&quot;\overline{D}&quot; alt=&quot;\overline{D}&quot; \/&gt; entscheidet und dabei auf H zurückgreifen kann (&amp;quot;H-Orakel&amp;quot;). Da &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Coverline%7BD%7D&quot; title=&quot;\overline{D}&quot; alt=&quot;\overline{D}&quot; \/&gt; aber nicht rekursiv ist, kann es ein rekursives H-Orakel nicht geben, sonst wäre &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Coverline%7BD%7D&quot; title=&quot;\overline{D}&quot; alt=&quot;\overline{D}&quot; \/&gt; auch rekursiv. Hier ist der Algorithmus (der sehr technisch ist und durchaus übersprungen werden kann):&lt;/p&gt;&lt;p&gt;- Finde i mit &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=w%3Dw_i&quot; title=&quot;w=w_i&quot; alt=&quot;w=w_i&quot; \/&gt;. D.h. wir suchen die Stelle in der Matrix, an der das angegebene Wort steht.&lt;/p&gt;&lt;p&gt;- Erstelle &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=M_i&quot; title=&quot;M_i&quot; alt=&quot;M_i&quot; \/&gt;. Das ist die zugehörige TM zum Eingabewort.&lt;/p&gt;&lt;p&gt;- Die TM &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=M_i&quot; title=&quot;M_i&quot; alt=&quot;M_i&quot; \/&gt; verwirft falsche Eingaben. Dieses Verhalten ersetzen wir durch eine Endlosschleife.&lt;/p&gt;&lt;p&gt;- Lasse das H-Orakel &amp;lt;M&amp;gt;w entscheiden.&lt;/p&gt;&lt;p&gt;Wenn das H-Orakel &amp;quot;&amp;lt;M&amp;gt;w hält&amp;quot; entscheidet, lassen wir die TM für &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Coverline%7BD%7D&quot; title=&quot;\overline{D}&quot; alt=&quot;\overline{D}&quot; \/&gt; &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=w_i%3Dw%5Cin%5Coverline%7BD%7D&quot; title=&quot;w_i=w\in\overline{D}&quot; alt=&quot;w_i=w\in\overline{D}&quot; \/&gt; entscheiden. Das wäre ein Algorithmus, der &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Coverline%7BD%7D&quot; title=&quot;\overline{D}&quot; alt=&quot;\overline{D}&quot; \/&gt; genau dann entscheidet, wenn H entscheidbar ist. &lt;/p&gt;&lt;p /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Damit wäre gezeigt, dass es kein Programm geben kann, dass die Korrektheit anderer Programme entscheiden kann. Man kann ja noch nicht einmal bestimmen, ob ein Programm auf jeder Eingabe hält oder nicht. Es ist sogar so, dass ein spezielleres Halteproblem &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=H_%5Cepsilon&quot; title=&quot;H_\epsilon&quot; alt=&quot;H_\epsilon&quot; \/&gt; nicht entscheidbar ist, bei dem berechnet werden soll, ob eine TM auf einer leeren Eingabe hält. Das beduetet allerdings nicht, dass man es gar nicht erst versuchen sollte. Schließlich gibt es auch in der Mathematik den (von der Beweisführung fast äquivalenten) Gödelschen Unvollständigkeitssatz, nachdem man nich erwarten kann, jemals alle mathematischen Sätze ableiten zu können. Trotzdem hat man die Mathematik noch nicht aufgegeben.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 18 Dec 2007 13:26:03 +0100</pubDate>
    <guid isPermaLink="false">http://zufallsbit.de/blog/index.php?/archives/142-guid.html</guid>
    
</item>
<item>
    <title>Die Diagonalsprache</title>
    <link>http://zufallsbit.de/blog/index.php?/archives/127-Die-Diagonalsprache.html</link>
            <category>Informatik</category>
    
    <comments>http://zufallsbit.de/blog/index.php?/archives/127-Die-Diagonalsprache.html#comments</comments>
    <wfw:comment>http://zufallsbit.de/blog/wfwcomment.php?cid=127</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://zufallsbit.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=127</wfw:commentRss>
    

    <author>nospam@example.com (Turing)</author>
    <content:encoded>
    &lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Obwohl ich im Moment echt durch den Wind bin, f&amp;uuml;hle ich irgendwie die Verpflichtung, hier auch mal wieder etwas substantielles zu schreiben, auch wenn es wahrscheinlich weniger umfangreich wird als sonst.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Es geht mal wieder um das Halteproblem, heute machen wir einen weiteren (und letzten) Zwischenschritt, um danach endlich das Halteproblem anzugehen.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Zun&amp;auml;chst brauchen wir daf&amp;uuml;r die so genannte kanonische Ordnung. Das ist eine spezielle Sortierung von Bitstrings (also eine Ordnung auf {0,1}*). Dabei steht ein Wort w vor einem anderen Wort w&#039;, wenn:&lt;br /&gt;&lt;br /&gt;
1)&amp;#160; |w| &amp;lt; |w&#039;|&lt;br /&gt;&lt;br /&gt;
oder 2) |w| = |w&#039;| und w steht lexikographisch vor w&#039;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Anders gesagt wird zuerst nach L&amp;auml;nge des Wortes, dann erst nach lexikographisch Ordnung sortiert. K&amp;uuml;rzeste Worte kommen also zuerst, inklusive dem leeren Wort: &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cepsilon&quot; title=&quot;\epsilon&quot; alt=&quot;\epsilon&quot; \/&gt;, 0, 1, 00, 01, 10, 11, 000, 001...&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Jetzt &amp;uuml;berlegen wir uns eine Matrix, wobei die Zeilen mit Turingmaschinen &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=M_i&quot; title=&quot;M_i&quot; alt=&quot;M_i&quot; \/&gt; und die Spalten mit allen m&amp;ouml;glichen Eingabew&amp;ouml;rtern &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=w_i&quot; title=&quot;w_i&quot; alt=&quot;w_i&quot; \/&gt; in kanonischer Ordnung gef&amp;uuml;llt werden. Das sieht bis jetzt so aus:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&amp;#160;&lt;img width=&quot;300&quot; height=&quot;150&quot; border=&quot;0&quot; src=&quot;uploads/diag1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Die Matrix ist nat&amp;uuml;rlich unendlich, denn sowohl die Anzahl der W&amp;ouml;rter als auch die Menge der G&amp;ouml;delnummern h&amp;ouml;rt nie auf. Jetzt kommt an eine Schnittstelle von Turingmaschine und Wort jeweils eine 0 oder eine 1, je nachdem ob die Turingmaschine das Wort akzeptiert oder nicht.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;img width=&quot;300&quot; height=&quot;150&quot; border=&quot;0&quot; src=&quot;uploads/diag2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;In diesem Fall w&amp;uuml;rde die Turingmaschine &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=M_1&quot; title=&quot;M_1&quot; alt=&quot;M_1&quot; \/&gt; die W&amp;ouml;rter {w2,w4,w5,...} akzeptieren und {w1,w3,w6,...} verwerfen. Das wird f&amp;uuml;r jede m&amp;ouml;gliche Turingmaschine gemacht, zumindest in Gedanken, denn praktisch d&amp;uuml;rfte so eine Matrix relativ schnell alle Speicher f&amp;uuml;llen.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;So weit so gut, aber was soll all der Bl&amp;ouml;dsinn? Stellen wir uns vor, wir h&amp;auml;tten eine Sprache, die immer falsch rechnet. Diese w&amp;auml;re mal ganz sicher nicht rekursiv, wir br&amp;auml;uchten uns nicht einmal Gedanken machen, wann sie unendlich l&amp;auml;uft oder nicht definiert ist. So eine Sprache ist die so genannte Diagonalsprache:&lt;br /&gt;&lt;br /&gt;
&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=D%3D%20%5C%7Bw_i%20%7C%20M_i%5C%20akzeptiert%5C%20w_i%5C%20nicht%5C%7D&quot; title=&quot;D= \{w_i | M_i\ akzeptiert\ w_i\ nicht\}&quot; alt=&quot;D= \{w_i | M_i\ akzeptiert\ w_i\ nicht\}&quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Informell gesagt ist das die Sprache, die alle W&amp;ouml;rter enth&amp;auml;lt, die die zugeh&amp;ouml;rige Turingmaschine nicht akzeptiert. Die zugeh&amp;ouml;rige Turingmaschine ist nat&amp;uuml;rlich die, die in der korrespondierenden Zeile steht. Und damit ist D die Sprache, die alle Nullen auf der Diagonale dieser Matrix enth&amp;auml;lt.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Das f&amp;uuml;hrt zu einem ziemlich &amp;uuml;blen Widerspruch. Die Annahme ist, dass die Sprache rekursiv ist. Das hei&amp;szlig;t, dass es eine TM gibt, die auf allen Eingaben h&amp;auml;lt und genau D akzeptiert. Nennen wir diese TM einfach &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=M_k&quot; title=&quot;M_k&quot; alt=&quot;M_k&quot; \/&gt;. Jetzt gibt es zwei interessante F&amp;auml;lle:&lt;br /&gt;&lt;br /&gt;
1) &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=w_k%20%5Cin%20D&quot; title=&quot;w_k \in D&quot; alt=&quot;w_k \in D&quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Das bedeutet, dass das zu &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=M_k&quot; title=&quot;M_k&quot; alt=&quot;M_k&quot; \/&gt; geh&amp;ouml;rige Wort&amp;#160;&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=w_k&quot; title=&quot;w_k&quot; alt=&quot;w_k&quot; \/&gt; zur Sprache geh&amp;ouml;rt. Dann steht an der Stelle in der Matrix nach Definition eine Null. Das w&amp;uuml;rde aber hei&amp;szlig;en, dass &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=M_k&quot; title=&quot;M_k&quot; alt=&quot;M_k&quot; \/&gt; &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=w_k&quot; title=&quot;w_k&quot; alt=&quot;w_k&quot; \/&gt; nicht akzeptieren darf, das sagt die Null ja gerade aus. Dann w&amp;uuml;rde die TM aber nicht auf jeder Eingabe korrekt arbeiten, mindestens auf seiner &amp;quot;eigenen&amp;quot; versagt sie.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;2) &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=w_k%20%5Cnot%5Cin%20D&quot; title=&quot;w_k \not\in D&quot; alt=&quot;w_k \not\in D&quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=w_k&quot; title=&quot;w_k&quot; alt=&quot;w_k&quot; \/&gt; darf nicht akzeptiert werden, denn es geh&amp;ouml;rt nicht zur Sprache. In der Matrix steht schlie&amp;szlig;lich eine 1. Nun, aber die Sprache enth&amp;auml;lt ja genau alle W&amp;ouml;rter, die von der zugeh&amp;ouml;rigen TM &lt;strong&gt;nicht&lt;/strong&gt; akzeptiert werden, das Wort m&amp;uuml;sste also zur Sprache geh&amp;ouml;ren, tut es aber nicht.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Wie man sieht f&amp;uuml;hren beide F&amp;auml;lle zum Widerspruch, keine Turingmaschine kann damit D akzeptieren und rechnet dabei immer richtig. Die Sprache ist damit definitiv nicht rekursiv. Das kann man benutzen um die nichtrekursivit&amp;auml;t des Halteproblems zu beweisen, das wird aber erst im n&amp;auml;chsten Beitrag passieren.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 22 Nov 2007 20:14:02 +0100</pubDate>
    <guid isPermaLink="false">http://zufallsbit.de/blog/index.php?/archives/127-guid.html</guid>
    <category>diagonalsprache</category>
<category>entscheidbarkeitstheorie</category>
<category>informatik</category>
<category>tm</category>
<category>turing-maschine</category>

</item>
<item>
    <title>Turing-berechenbare Funktionen und die Churchsche These</title>
    <link>http://zufallsbit.de/blog/index.php?/archives/117-Turing-berechenbare-Funktionen-und-die-Churchsche-These.html</link>
            <category>Informatik</category>
    
    <comments>http://zufallsbit.de/blog/index.php?/archives/117-Turing-berechenbare-Funktionen-und-die-Churchsche-These.html#comments</comments>
    <wfw:comment>http://zufallsbit.de/blog/wfwcomment.php?cid=117</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://zufallsbit.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=117</wfw:commentRss>
    

    <author>nospam@example.com (Turing)</author>
    <content:encoded>
    &lt;p&gt;Es f&amp;auml;llt auf, dass Turingmaschinen, die ein Entscheidungsproblem berechnen am Ende immer entweder eine Null oder eine Eins auf dem Band stehen haben. Man k&amp;ouml;nnte sagen, die Turingmaschine &amp;quot;entscheidet eine Sprache&amp;quot; in dem Sinne, dass sie f&amp;uuml;r jedes Wort, das man auf das Band schreibt, entweder &lt;em&gt;true&lt;/em&gt; (Wort geh&amp;ouml;rt zur Sprache) oder &lt;em&gt;false &lt;/em&gt;(Geh&amp;ouml;rt nicht zur Sprache) ausgibt. Ein einfaches Beispiel hilft vielleicht.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=M%3D%5C%7BQ%2C%5CGamma%2CB%2C%5CSigma%2C%5Cdelta%2Cq_0%5C%7D&quot; title=&quot;M=\{Q,\Gamma,B,\Sigma,\delta,q_0\}&quot; alt=&quot;M=\{Q,\Gamma,B,\Sigma,\delta,q_0\}&quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5CGamma%3D%5CSigma%3D%7Ba%2Cb%7D&quot; title=&quot;\Gamma=\Sigma={a,b}&quot; alt=&quot;\Gamma=\Sigma={a,b}&quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cdelta%28q_0%2Ca%29%3D%28q_0%2Ca%2C%2B1%29&quot; title=&quot;\delta(q_0,a)=(q_0,a,+1)&quot; alt=&quot;\delta(q_0,a)=(q_0,a,+1)&quot; \/&gt;,&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cdelta%28q_0%2Cb%29%3D%28q_1%2Cb%2C0%29&quot; title=&quot;\delta(q_0,b)=(q_1,b,0)&quot; alt=&quot;\delta(q_0,b)=(q_1,b,0)&quot; \/&gt;,&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cdelta%28q_0%2CB%29%3D%28q_2%2CB%2C0%29&quot; title=&quot;\delta(q_0,B)=(q_2,B,0)&quot; alt=&quot;\delta(q_0,B)=(q_2,B,0)&quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Das sind alle Zustands&amp;uuml;berg&amp;auml;nge f&amp;uuml;r &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=q_0&quot; title=&quot;q_0&quot; alt=&quot;q_0&quot; \/&gt;. Der erste ist f&amp;uuml;r den Fall, dass ein &amp;quot;a&amp;quot; eingelesen wird. Da passiert nichts weiter, der Kopf bewegt sich nur nach rechts. Wenn ein b gelesen wird, wechselt die TM im den Zustand &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=q_1&quot; title=&quot;q_1&quot; alt=&quot;q_1&quot; \/&gt; und schreibt das b zur&amp;uuml;ck aufs Band. Was in &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=q_1&quot; title=&quot;q_1&quot; alt=&quot;q_1&quot; \/&gt; passiert, habe ich nicht explizit angegeben, weil es m&amp;uuml;hselig und langweilig w&amp;auml;re. Was passieren *soll* ist, dass die Turingmaschine das Wort verwirft. Das w&amp;uuml;rde bedeuten, in &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=q_1&quot; title=&quot;q_1&quot; alt=&quot;q_1&quot; \/&gt; liefe der Kopf bis ans Ende des Wortes (also bis ein B gelesen wird), l&amp;auml;uft dann zur&amp;uuml;ck und l&amp;ouml;scht dabei jeden Buchstaben. Wenn wieder ein B gelesen wird bedeutet das, dass wir eine Zelle links vom Anfang des Wortes angekommen sind. Wir gehen also noch einen Schritt nach rechts und schreiben eine 0 f&amp;uuml;r &lt;em&gt;false&lt;/em&gt;. Ich hoffe mir ist niemand b&amp;ouml;se, dass ich DAS nicht alles in einer TM codieren wollte. Es sollte aber klar sein, dass es prinzipiell machbar w&amp;auml;re.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Bleibt der letzte Zustands&amp;uuml;bergang, n&amp;auml;mlich wenn ein B im Zustand &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=q_0&quot; title=&quot;q_0&quot; alt=&quot;q_0&quot; \/&gt; gelesen wird. Das w&amp;uuml;rde ja bedeuten, dass wir am Ende des Wortes angekommen sind, ohne jemals auf ein b getroffen zu sein, denn sonst w&amp;auml;ren wir in &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=q_1&quot; title=&quot;q_1&quot; alt=&quot;q_1&quot; \/&gt; gelandet und die TM h&amp;auml;tte 0 ausgegeben. Im neuen Zustand &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=q_2&quot; title=&quot;q_2&quot; alt=&quot;q_2&quot; \/&gt; w&amp;uuml;rde im Wesentlichen das gleiche passieren wie in &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=q_1&quot; title=&quot;q_1&quot; alt=&quot;q_1&quot; \/&gt;, nur dass am Ende eine 1 geschrieben wird.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Die Turingmaschine verwirft also alle Worte, die ein &amp;quot;b&amp;quot; enthalten und akzeptiert alle, die nur aus &amp;quot;a&amp;quot; bestehen. (Bonusfrage: Was ist mit dem leeren Wort? Antwort: Wird auch akzeptiert.) Als Sprache ausgedr&amp;uuml;ckt hie&amp;szlig;e das &amp;uuml;brigens L={ a* }, wobei * den kleenschen Abschluss darstellt, was im Grunde nur &amp;quot;beliebige Anzahl&amp;quot; bedeutet. Und das ist in der Tat eine starke Verbindung zwischen zwei unterschiedlichen Feldern. Eine TM im Entscheidungsmodus und eine Sprache sind ein und dasselbe. Man kann eine Sprache definieren und eine Turingmaschine bauen, die f&amp;uuml;r jedes Wort der Eingabe &amp;quot;1&amp;quot; ausgibt. Umgekehrt gilt das nat&amp;uuml;rlich auch, denn wenn uns jemand eine Turingmaschine gibt, k&amp;ouml;nnen wir gucken was die f&amp;uuml;r W&amp;ouml;rter akzeptiert und uns eine entsprechende Sprache &amp;uuml;berlegen. Es sind zwei Seiten einer Medaille: Sprachen sind mehr der konstruktive Teil, man will *aktiv* eine Menge von W&amp;ouml;rtern generieren und &amp;uuml;berlegt sich, wie das geht. Die Turingmaschine generiert nichts, sie entscheidet lediglich, ob ein Wort zur Sprache geh&amp;ouml;rt oder nicht.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Wir n&amp;auml;hern uns unaufhaltsam dem eigentlichen Thema, denn jetzt kann man sich nat&amp;uuml;rlich &amp;uuml;berlegen, ob es wirklich f&amp;uuml;r jede Sprache eine entsprechend richtig entscheidende Turingmaschine gibt. Daf&amp;uuml;r definiere ich das ganze nochmal etwas mathematischer.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Zu einer beliebigen Sprache L gibt es eine so genannte charakteristische Funktion &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cchi_L%28x%29%3A%3D%5Cleft%5C%7B%5Ctext%7B1%2C%20falls%20x%20%5Cin%20L%5C%5C0%20sonst%7D%5Cright.&quot; title=&quot;\chi_L(x):=\left\{\text{1, falls x \in L\\0 sonst}\right.&quot; alt=&quot;\chi_L(x):=\left\{\text{1, falls x \in L\\0 sonst}\right.&quot; \/&gt;. Das ist jetzt sozusagen das mathematische &amp;Auml;quivalent zu dem oben beschriebenen Sachverhalt. Die Funktion evaluiert zu 1, wenn das Wort in der Sprache ist, sonst zu 0.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Eine Funktion f hei&amp;szlig;t Turing-berechenbar, falls sie &amp;uuml;berall definiert ist und falls f von einer TM berechnet werden kann. Dabei muss die TM bei allen Eingaben halten und am Ende wie gefordert 0 oder 1 auf dem Band stehen haben. Eine Sprache L wird Turing-berechenbar genannt, falls die zugeh&amp;ouml;rige Funktion &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cchi&quot; title=&quot;\chi&quot; alt=&quot;\chi&quot; \/&gt; Turing-berechenbar ist. Hier h&amp;auml;tten wir also eine formale Verbindung zwischen den drei Betrachtungsweisen. Eine Sprache wird in eine mathematische Funktion umgebastelt, die wiederum von einer Turingmaschine entschieden wird. &amp;Uuml;brigens hei&amp;szlig;t &amp;quot;Turing-berechenbar&amp;quot; auch &amp;quot;rekursiv&amp;quot; und hat nichts mit einem rekursiven Programmaufruf zu tun.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&amp;#160;Rekursiv ist eine Funktion &amp;uuml;brigens auch, wenn die entscheidende Turingmaschine nur dann rechnet, wenn die Eingabe aus dem Definitionsbereich ist. Zum Beispiel macht ein Sortieralgorithmus f&amp;uuml;r Ganzzahlen nur f&amp;uuml;r ganzzahlige Eingaben Sinn. Wenn man da einfach ein paar Strings eingeben w&amp;uuml;rde, d&amp;uuml;rfte die TM formell unendlich weiter rechnen (weil Turingmaschinen keine Exceptions kennen). Trotzdem w&amp;auml;re dieses Verhalten rekursiv. Dann gibt es noch eine letzte wichtige Klasse von Sprachen, die man &amp;quot;rekursiv aufz&amp;auml;hlbar&amp;quot; nennt. Ich verzichte mal auf eine formale Definition, denn der Unterschied ist auch so leicht zu verstehen. Die TM akzeptiert jedes Wort der Sprache nach wie vor in endlicher Zeit, wenn das Eingabewort aber nicht zur Sprache geh&amp;ouml;rt, rechnet die TM unendlich.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Man, das war lang und langweilig. Damit sind die Vorbereitungen aber endlich abgeschlossen und wir k&amp;ouml;nnen bald endlich &amp;uuml;ber das Halteproblem sprechen. Bleibt nur noch ein Wort &amp;uuml;ber die Church-Turing-These zu verlieren.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Diese geht n&amp;auml;mlich so: &amp;quot;Die Klasse der Turing-berechenbaren Funktionen ist genau die Klasse der intuitiv berechenbaren Funktionen.&amp;quot; Was eine Turing-berechenbare Funktion ist, wissen wir ja jetzt. &amp;quot;Intuitiv berechenbare Funktionen&amp;quot; k&amp;ouml;nnen dagegen nicht so sch&amp;ouml;n definiert werden, man versteht darunter mehr oder weniger alle Funktionen die wir Menschen uns so ausdenken k&amp;ouml;nnen. Alles was wir Menschen im Prinzip ausrechnen k&amp;ouml;nnten. Sind das nicht *alle* Funktionen, die es gibt? Vermutlich ja, zumindest ist es schwer sich vorzustellen, was es f&amp;uuml;r Funktionen geben k&amp;ouml;nnte, die wir uns nicht ausdenken k&amp;ouml;nnen. Das liegt aber irgendwie in der Natur der Sache, denn wie sollten wir uns diese Funktionen wohl ausdenken k&amp;ouml;nnen, wenn es gerade deren Eigenschaft ist, nicht von uns erdacht werden k&amp;ouml;nnen?&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Die These besagt also, dass Computer keine L&amp;uuml;cken in ihrer Rechenkraft haben. Alle Dinge die wir entscheiden k&amp;ouml;nnen, k&amp;ouml;nnen auch Computer entscheiden. Aber sind alle Computer gleich m&amp;auml;chtig? Das sagt uns zumindest die (ebenfalls nicht beweisbare) erweiterte Chruchsche These: &amp;quot;F&amp;uuml;r je zwei Rechnermodelle R&lt;sub&gt;1&lt;/sub&gt; und R&lt;sub&gt;2&lt;/sub&gt; gibt es ein Polynom p, so dass t Rechenschritte auf Modell R&lt;sub&gt;1&lt;/sub&gt; bei Eingabe der L&amp;auml;nge n durch p(t,n) Rechenschritte auf Modell R&lt;sub&gt;2&lt;/sub&gt; simuliert werden k&amp;ouml;nnen.&amp;quot; Die Umrechnung von einem auf den anderen Computer soll also maximal in Polynomialzeit machbar sein, was uns Theoretikern zur Zufriedenheit reicht.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 31 Oct 2007 20:49:00 +0100</pubDate>
    <guid isPermaLink="false">http://zufallsbit.de/blog/index.php?/archives/117-guid.html</guid>
    <category>algorithmus</category>
<category>entscheidbarkeitstheorie</category>
<category>formale sprachen</category>
<category>informatik</category>

</item>
<item>
    <title>Wolframs 2,3 TM ist universell!</title>
    <link>http://zufallsbit.de/blog/index.php?/archives/114-Wolframs-2,3-TM-ist-universell!.html</link>
            <category>Informatik</category>
    
    <comments>http://zufallsbit.de/blog/index.php?/archives/114-Wolframs-2,3-TM-ist-universell!.html#comments</comments>
    <wfw:comment>http://zufallsbit.de/blog/wfwcomment.php?cid=114</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://zufallsbit.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=114</wfw:commentRss>
    

    <author>nospam@example.com (Turing)</author>
    <content:encoded>
    &lt;p&gt;Ich glaubs ja kaum. Stephen Wolfram hat 2004 eine Turingmaschine entworfen und 25000$ f&amp;uuml;r einen Beweis ausgelobt, der die Universalit&amp;auml;t entscheidet. Heute, am gleichen Tag an dem ich zuf&amp;auml;llig meinen Beitrag &amp;uuml;ber &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/zufallsbit.de/blog/index.php?/archives/113-Universelle-Turingmaschinen.html&#039;);&quot;  href=&quot;http://zufallsbit.de/blog/index.php?/archives/113-Universelle-Turingmaschinen.html&quot;&gt;Universelle Turingmaschinen&lt;/a&gt; geschrieben habe kommt das rein: &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.wolframscience.com/prizes/tm23/solution_news.html&#039;);&quot;  href=&quot;http://www.wolframscience.com/prizes/tm23/solution_news.html&quot;&gt;Wolfram&#039;s 2,3 Turing Machine Is Universal!&lt;/a&gt; (&lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.wolframscience.com/prizes/tm23/TM23Proof.pdf&#039;);&quot;  href=&quot;http://www.wolframscience.com/prizes/tm23/TM23Proof.pdf&quot;&gt;Beweis&lt;/a&gt;) Damit ist es die kleinste bekannte universelle Turingmaschine. &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/www.wolframscience.com/prizes/tm23/technicaldetails.html&#039;);&quot;  href=&quot;http://www.wolframscience.com/prizes/tm23/technicaldetails.html&quot;&gt;Hier gibts technische Details.&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&amp;#160;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 24 Oct 2007 18:25:00 +0200</pubDate>
    <guid isPermaLink="false">http://zufallsbit.de/blog/index.php?/archives/114-guid.html</guid>
    <category>entscheidbarkeitstheorie</category>
<category>informatik</category>
<category>tm</category>
<category>turing-maschine</category>
<category>universelle turingmaschinen</category>
<category>utm</category>

</item>
<item>
    <title>Universelle Turingmaschinen</title>
    <link>http://zufallsbit.de/blog/index.php?/archives/113-Universelle-Turingmaschinen.html</link>
            <category>Informatik</category>
    
    <comments>http://zufallsbit.de/blog/index.php?/archives/113-Universelle-Turingmaschinen.html#comments</comments>
    <wfw:comment>http://zufallsbit.de/blog/wfwcomment.php?cid=113</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://zufallsbit.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=113</wfw:commentRss>
    

    <author>nospam@example.com (Turing)</author>
    <content:encoded>
    &lt;p&gt;Vielleicht erinnert sich noch jemand, dass ich in grauer Vorzeit mal eine Serie &amp;uuml;ber Automatentheorie gestartet habe, mit dem Ziel, irgendwann zur Entscheidbarkeitstheorie zu gelangen. Der Grund, warum ich das nie weitergef&amp;uuml;hrt habe ist, dass ich Automatentheorie nicht besonders spannend finde. Also &amp;uuml;berspringe ich den langweiligen Teil, komme direkt wieder zu Turingmaschinen und schreibe vielleicht sp&amp;auml;ter einen Beitrag &amp;uuml;ber Automatentheorie mit einem eher zusammenfassenderen Charakter.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Entscheidbarkeitstheorie also. Die meisten Probleme sind ja irgendwie durch eine konkrete Fragestellung motiviert. Hier ist diese Frage, welche Funktionen entschieden werden k&amp;ouml;nnen und welche nicht. Ich werde noch darauf kommen was das im Detail bedeutet. Erstmal f&amp;uuml;hren wir eine neue Art Turingmaschine ein, die wir sp&amp;auml;ter brauchen.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Eine Turingmaschine, nennen wir sie &lt;em&gt;M&lt;/em&gt;, ist ja folgenderma&amp;szlig;en definiert: &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=M%3D%5C%7BQ%2C%5CGamma%2CB%2C%5CSigma%2C%5Cdelta%2Cq_0%5C%7D&quot; title=&quot;M=\{Q,\Gamma,B,\Sigma,\delta,q_0\}&quot; alt=&quot;M=\{Q,\Gamma,B,\Sigma,\delta,q_0\}&quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Dabei ist Q die Menge der Zust&amp;auml;nde und q&lt;sub&gt;0&lt;/sub&gt; identifiziert den Startzustand. &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5CGamma&quot; title=&quot;\Gamma&quot; alt=&quot;\Gamma&quot; \/&gt; ist das Bandalphabet und umfasst alle Buchstaben, die auf dem Band auftreten k&amp;ouml;nnen. Dazu geh&amp;ouml;rt insbesondere das &amp;quot;Blank&amp;quot; B, das nur als Platzhalter f&amp;uuml;r &amp;quot;leer&amp;quot; steht. F&amp;uuml;r die bessere Lesbarkeit. &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5CSigma&quot; title=&quot;\Sigma&quot; alt=&quot;\Sigma&quot; \/&gt; ist das Eingabealphabet, was im wesentlichen mit dem Bandalphabet identisch ist, nur ohne das B. Au&amp;szlig;erdem k&amp;ouml;nnen spezielle &amp;quot;Trennungssymbole&amp;quot; im Bandalphabet vorkommen, die man beim Entwurf des Algorithmus zur Vereinfachung verwenden kann. Genau wie man bei C++ Programmen vielleicht eine tempor&amp;auml;re Variable zur Zwischenberechnung von Ergebnissen verwenden w&amp;uuml;rde. Bleibt das &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cdelta&quot; title=&quot;\delta&quot; alt=&quot;\delta&quot; \/&gt;, was die Zustands&amp;uuml;bergangsfunktion darstellt. Wir erinnern uns: Eine Turingmaschine liest in jedem Schritt genau ein Zeichen, wechselt den Zustand, schreibt ein Zeichen zur&amp;uuml;ck und bewegt den Kopf. Die Zustands&amp;uuml;bergangsfunktion beschreibt, abh&amp;auml;ngig von gelesenen Zeichen und dem aktuellen Zustand, welche Aktionen passieren sollen. Oder anders gesagt: &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cdelta%20%3A%20Q%20%5Ctimes%20%5CGamma%20%5Crightarrow%20Q%20%5Ctimes%20%5CGamma%20%5Ctimes%20%5C%7B-1%2C0%2C%2B1%5C%7D&quot; title=&quot;\delta : Q \times \Gamma \rightarrow Q \times \Gamma \times \{-1,0,+1\}&quot; alt=&quot;\delta : Q \times \Gamma \rightarrow Q \times \Gamma \times \{-1,0,+1\}&quot; \/&gt;, wobei &amp;quot;0&amp;quot; f&amp;uuml;r &amp;quot;keine Kopfbewegung&amp;quot; und -1 oder +1 f&amp;uuml;r &amp;quot;links&amp;quot; bzw. &amp;quot;rechts&amp;quot; steht.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;So eine gew&amp;ouml;hnliche Turingmaschine hat einen gewaltigen Nachteil. Sie ist mit der formalen Definition bereits vollst&amp;auml;ndig programmiert. Und zwar endg&amp;uuml;ltig. Viel sch&amp;ouml;ner und vertrauter w&amp;auml;re es doch, wenn eine Turingmaschine nur die &amp;quot;Hardware&amp;quot; zur Verf&amp;uuml;gung stellen w&amp;uuml;rde und wir das Programm auf das Band schreiben k&amp;ouml;nnten, genau wie wir das bei normalen Computern tun. Da schreiben wir das Programm auf die Festplatte (genauer gesagt in den Bootsektor) und von da aus guckt unser Computer nur, welches Programm an der richtigen Stelle der Festplatte zur Ausf&amp;uuml;hrung bereit liegt. Man stelle sich vor, wir w&amp;uuml;rden f&amp;uuml;r jeden auszuf&amp;uuml;hrenden Algorithmus einen neuen Prozessor kaufen und dem nur die Instanzen f&amp;uuml;ttern. Ein Sortierprozessor zum Beispiel, dem wir nur Ganzzahlen zum Sortieren geben k&amp;ouml;nnten, oder ein &amp;quot;F&amp;uuml;lle-den-Cache-mit-Daten-Prozessor&amp;quot;. Im echten Leben mutet das absurd an, aber so machen es klassische Turingmaschinen und f&amp;uuml;r die Theorie kann man das auch tun.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Aber es geht eben auch anders, und das nennt man eine &amp;quot;universelle Turingmaschine&amp;quot;, kurz UTM, noch k&amp;uuml;rzer &lt;em&gt;U&lt;/em&gt;. Diese kann ein beliebiges Programm (bzw. eine andere, normale Turingmaschine M) ausf&amp;uuml;hren. Die Eingabe besteht jetzt nicht mehr aus einem Wort w, sondern aus (&amp;lt;M&amp;gt;w). Dabei ist w nach wie vor das zu bearbeitende Wort, neu ist &amp;lt;M&amp;gt;, die so genannte &lt;em&gt;G&amp;ouml;delnummer&lt;/em&gt; der zu simulierenden Turingmaschine M.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Man kann jede normale TM in eine lange Zahl codieren, die dann wiederum eindeutig ist. Zu jeder G&amp;ouml;delnummer geh&amp;ouml;rt genau eine Turingmaschine. Diese Nummer wiederum gibt man dann als Eingabe an die UTM, die dann die zur G&amp;ouml;delnummer zugeh&amp;ouml;rige TM simuliert. Diese Codierung funktioniert so:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5CGamma%3D%5C%7B0%2C%201%2C%20B%5C%7D&quot; title=&quot;\Gamma=\{0, 1, B\}&quot; alt=&quot;\Gamma=\{0, 1, B\}&quot; \/&gt;, dann &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=X_0%3D0%2C%20X_1%3D1%2C%20X_2%3DB&quot; title=&quot;X_0=0, X_1=1, X_2=B&quot; alt=&quot;X_0=0, X_1=1, X_2=B&quot; \/&gt; und Kopfbewegungen &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=D_1%3D-1%2C%20D_2%3D0%2C%20D_3%3D%2B1&quot; title=&quot;D_1=-1, D_2=0, D_3=+1&quot; alt=&quot;D_1=-1, D_2=0, D_3=+1&quot; \/&gt;, dann &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cdelta%28q_i%20%2CX_j%29%20%3D%20%28q_k%2C%20X_l%2C%20D_m%29&quot; title=&quot;\delta(q_i ,X_j) = (q_k, X_l, D_m)&quot; alt=&quot;\delta(q_i ,X_j) = (q_k, X_l, D_m)&quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Keine Erkl&amp;auml;rung n&amp;ouml;tig soweit? Doch? Na gut.&amp;#160;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Zuerst transferieren wir das Bandalphabet (hier oBdA {0,1,B}) in &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=X_0%3D0%2C%20X_1%3D1%2C%20X_2%3DB&quot; title=&quot;X_0=0, X_1=1, X_2=B&quot; alt=&quot;X_0=0, X_1=1, X_2=B&quot; \/&gt;. Jetzt gibt es also f&amp;uuml;r jeden m&amp;ouml;glichen Bandbuchstaben ein entsprechendes X mit einem Index dran. Das gleiche passiert mit den Kopfbewegungen. Statt {-1,0+1} benutzen wir jetzt die Ds mit jeweils einem Index. Warum wir diese scheinbar sinnlose Transformation machen wird erst gleich klar, erstmal m&amp;uuml;ssen wir uns einig sein, dass man den Zustands&amp;uuml;bergang jetzt auch schreiben kann wie &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cdelta%28q_i%20%2CX_j%29%20%3D%20%28q_k%2C%20X_l%2C%20D_m%29&quot; title=&quot;\delta(q_i ,X_j) = (q_k, X_l, D_m)&quot; alt=&quot;\delta(q_i ,X_j) = (q_k, X_l, D_m)&quot; \/&gt;. Der Vorteil ist, dass jetzt alle Zustands&amp;uuml;berg&amp;auml;nge bis auf die Indizes gleich aussehen (bitte nochmal genau hinschauen wenn das nicht klar ist). Wenn man also wollte, k&amp;ouml;nnte man die &amp;Uuml;berg&amp;auml;nge also auch &lt;strong&gt;nur mit Zahlen aufschreiben&lt;/strong&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Und das ist ja schlie&amp;szlig;lich unser Ziel gewesen. Nun, die universelle TM hat allerdings auch nur ein {0,1} Alphabet, deshalb notiert man einen einzelnen Zustands&amp;uuml;bergang so:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cdelta%28q_i%20%2CX_j%29%20%3D%20%28q_k%2C%20X_l%2C%20D_m%29%20%5Clongrightarrow%200%5Ei10%5Ej10%5Ek10%5El10%5Em&quot; title=&quot;\delta(q_i ,X_j) = (q_k, X_l, D_m) \longrightarrow 0^i10^j10^k10^l10^m&quot; alt=&quot;\delta(q_i ,X_j) = (q_k, X_l, D_m) \longrightarrow 0^i10^j10^k10^l10^m&quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Jetzt dienen die Einsen als &amp;quot;Trenner&amp;quot; f&amp;uuml;r eine Anzahl von Nullen, die mit dem urspr&amp;uuml;nglichen Zustands&amp;uuml;bergang korrespondiert. Ein alter &amp;Uuml;bergang &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cdelta%28q_2%20%2C0%29%20%3D%20%28q_4%2C%201%2C%20-1%29&quot; title=&quot;\delta(q_2 ,0) = (q_4, 1, -1)&quot; alt=&quot;\delta(q_2 ,0) = (q_4, 1, -1)&quot; \/&gt; w&amp;uuml;rde mit X&lt;sub&gt;0&lt;/sub&gt;=0, X&lt;sub&gt;1&lt;/sub&gt;=1 und D&lt;sub&gt;1&lt;/sub&gt;=-1 aussehen wie 001100001010. Wenn ich ab jetzt code(x) schreibe, meine ich abk&amp;uuml;rzend eine solche Zahl, einen Zustands&amp;uuml;bergang repr&amp;auml;sentierend.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Wo wir uns jetzt diese ganze Arbeit gemacht haben, k&amp;ouml;nnen wir damit endlich wieder auf die G&amp;ouml;delnummer zur&amp;uuml;ck kommen. Die sieht jetzt n&amp;auml;mlich so aus:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;111 code(1) 11 code(2) 11 ... 11 code(n-1) 11 code(n) 111&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Drei Einsen markieren also Start und Ende der G&amp;ouml;delnummer, zwei Einsen trennen zwei Codierungen f&amp;uuml;r die &amp;Uuml;berg&amp;auml;nge. Das Ziel ist erreicht, die Turingmaschine wird in einer langen, langen Nummer notiert, die offensichtlich auch wieder in die entsprechende Maschine zur&amp;uuml;ck rechnen l&amp;auml;sst. Wenn wir jetzt eine solche G&amp;ouml;delnummer, zusammen mit dem zu entscheidenden Wort an die UTM &amp;uuml;bergeben, kann diese Schritt f&amp;uuml;r Schritt die G&amp;ouml;delnummer lesen, den neuen Zustand (und damit die neue Position in der G&amp;ouml;delnummer) berechnen und am Ende entscheiden, ob das Wort akzeptiert wird oder nicht. Wie das genau funktioniert wollt ihr nicht wissen, die G&amp;ouml;delnummerkonstruktion war ja schon etwas unheimlich. Nur so viel: Man kann Turingmaschinen auch mit mehreren Speicherb&amp;auml;ndern definieren. Davon nehmen wir uns in diesem Fall drei, schreiben die zu simulierende G&amp;ouml;delnummer auf das erste, das Wort auf das zweite und auf das dritte kommt der aktuelle Zustand der zu simulierenden TM. Dann wird die Programmierung der UTM zwar weniger h&amp;auml;sslich, aber nicht viel.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Bleibt die Frage nach der Rechenzeit. Wenn man sich die Rechenoperationen der UTM allerdings genau anschaut, wird schnell klar, dass die aufw&amp;auml;ndigste Operation die Suche nach der neuen Position in der G&amp;ouml;delnummer ist. Die UTM ist damit nur konstant langsamer als die urspr&amp;uuml;ngliche TM, hier droht also keine exponentielle Gefahr, au&amp;szlig;er die urspr&amp;uuml;ngliche TM war eh schon exponentiell langsam.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;So weit, so gut. Wir haben gesehen, dass man eine TM auch als lange Nummer schreiben kann. Au&amp;szlig;erdem gibt es offensichtliche eine universelle Turingmaschine, die mit dieser Nummer und dem zu entscheidenden Wort diese TM simulieren kann. Benutzen kann man das f&amp;uuml;r... &amp;auml;&amp;auml;h... eigentlich kann man das nicht benutzen. Man braucht es lediglich sp&amp;auml;ter f&amp;uuml;r einen wichtigen Beweis. Ist theoretische Informatik nicht sch&amp;ouml;n?&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Wer hier aber dringend eine &amp;quot;Aufl&amp;ouml;sung&amp;quot; braucht, der kann sich ja damit behelfen, dass die UTM offenbar eine praxisn&amp;auml;here Version von Turingmaschinen darstellt, denn man kann sie (auf aufw&amp;auml;ndige Art und weise) programmieren und muss sich nicht f&amp;uuml;r jeden Algorithmus eine neue Turingmaschine kaufen. Gott sei dank.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a onclick=&quot;javascript: pageTracker._trackPageview(&#039;/extlink/zufallsbit.de/blog/index.php?/archives/114-Wolframs-2,3-TM-ist-universell!.html&#039;);&quot;  href=&quot;http://zufallsbit.de/blog/index.php?/archives/114-Wolframs-2,3-TM-ist-universell!.html&quot;&gt;&amp;Uuml;brigens..&lt;/a&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 24 Oct 2007 07:49:00 +0200</pubDate>
    <guid isPermaLink="false">http://zufallsbit.de/blog/index.php?/archives/113-guid.html</guid>
    <category>entscheidbarkeitstheorie</category>
<category>halteproblem</category>
<category>informatik</category>
<category>tm</category>
<category>turing-maschine</category>
<category>universelle turingmaschinen</category>
<category>utm</category>

</item>
<item>
    <title>Ach was solls..</title>
    <link>http://zufallsbit.de/blog/index.php?/archives/103-Ach-was-solls...html</link>
            <category>Informatik</category>
            <category>Sonstiges</category>
    
    <comments>http://zufallsbit.de/blog/index.php?/archives/103-Ach-was-solls...html#comments</comments>
    <wfw:comment>http://zufallsbit.de/blog/wfwcomment.php?cid=103</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://zufallsbit.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=103</wfw:commentRss>
    

    <author>nospam@example.com (Turing)</author>
    <content:encoded>
    &lt;br /&gt;
&lt;p&gt;Ich bin eher der Typ, der einmal liegengelassene Sachen nie, nie, NIE wieder anpackt. Deshalb habe ich den Comic vom letzten Beitrag wenigstens soweit fertig gemalt, dass man wenigstens etwas erkennen kann. Ich kann es wirklich besser, aber irgendwie habe ich den Ehrgeiz gerade nicht. (Creative Commons by-nc)&lt;/p&gt;&lt;p&gt;&lt;!-- s9ymdb:24 --&gt;&lt;!-- s9ymdb:24 --&gt;&lt;img width=&quot;800&quot; height=&quot;600&quot; src=&quot;http://zufallsbit.de/blog/uploads/karplipton.png&quot; style=&quot;border: 0px none ; float: left; padding-left: 5px; padding-right: 5px;&quot; /&gt;&lt;/p&gt;&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Mon, 15 Oct 2007 23:18:09 +0200</pubDate>
    <guid isPermaLink="false">http://zufallsbit.de/blog/index.php?/archives/103-guid.html</guid>
    <category>informatik</category>
<category>karp</category>
<category>komplexitÃ¤t</category>
<category>lipton</category>
<category>p/poly</category>
<category>ph</category>
<category>sonstiges</category>

</item>
<item>
    <title>Die größten Informatiker aller Zeiten</title>
    <link>http://zufallsbit.de/blog/index.php?/archives/78-Die-groessten-Informatiker-aller-Zeiten.html</link>
            <category>Informatik</category>
    
    <comments>http://zufallsbit.de/blog/index.php?/archives/78-Die-groessten-Informatiker-aller-Zeiten.html#comments</comments>
    <wfw:comment>http://zufallsbit.de/blog/wfwcomment.php?cid=78</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://zufallsbit.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=78</wfw:commentRss>
    

    <author>nospam@example.com (Turing)</author>
    <content:encoded>
    &lt;p&gt;Ich kam gestern von einer Party wieder, wo ich mich zugegebenerma&amp;szlig;en etwas betrunken habe. Zum Gl&amp;uuml;ck habe ich da einen Physiker gefunden, mit dem ich diskutieren konnte ohne als Fachidiot zu gelten. Dieser Physiker hielt Einstein f&amp;uuml;r komplett &amp;uuml;bersch&amp;auml;tzt und nominierte den Erfinder der M-Theorie als Nummer eins. (Ich habe den Namen gerade vergessen, was die M-Theorie ist, bleibt dem interessierten Leser nachzuschlagen. M&amp;ouml;glicherweise unter dem Thema &amp;quot;Stringtheorie&amp;quot;).&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Ich bin in Physik nicht gebildet genug um so etwas entschieden zu k&amp;ouml;nnen. Was ich aber beurteilen kann, ist die Informatik-Szene. Ich habe den gesamten Heimweg &amp;uuml;ber die Frage nachgedacht, wer der gr&amp;ouml;&amp;szlig;te Informatiker sein k&amp;ouml;nnte und bin bei folgender Liste angekommen:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;1. Alan Turing&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;2. Kurt G&amp;ouml;del (nicht im strengen Sinne Informatiker, aber irgendwie einflussreich)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;3. John von Neumann&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;4. Donald Knuth&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;5. Dijkstra&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Auf den Pl&amp;auml;tzen folgen f&amp;uuml;r mich Karp, Wirth, Hoare, Cook und Cocke.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Gibt es andere Meinungen?&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 21 Aug 2007 08:49:00 +0200</pubDate>
    <guid isPermaLink="false">http://zufallsbit.de/blog/index.php?/archives/78-guid.html</guid>
    
</item>
<item>
    <title>Kontextfreie Sprachen und die BNF</title>
    <link>http://zufallsbit.de/blog/index.php?/archives/76-Kontextfreie-Sprachen-und-die-BNF.html</link>
            <category>Informatik</category>
    
    <comments>http://zufallsbit.de/blog/index.php?/archives/76-Kontextfreie-Sprachen-und-die-BNF.html#comments</comments>
    <wfw:comment>http://zufallsbit.de/blog/wfwcomment.php?cid=76</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://zufallsbit.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=76</wfw:commentRss>
    

    <author>nospam@example.com (Turing)</author>
    <content:encoded>
    &lt;p&gt;Ein spezieller Typ formaler Sprachen sind die so genannten kontextfreien Sprachen. Sie sind auch die praxisrelevantesten und deren Konstruktion sieht irgendwie am nat&amp;uuml;rlichsten aus, deshalb fange ich mit ihnen an.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Um kontextfreie Sprachen zu beschreiben benutzt man oft die Backus-Naur Form. Das ist im Grunde nur eine spezielle Syntax um die Produktionsregeln &amp;uuml;bersichtlich hinzuschreiben. Es gibt allerdings auch ein paar neue Begriffe. Da sind zum einen die &lt;em&gt;Terminale&lt;/em&gt;. Das sind &amp;quot;finale&amp;quot; Buchstaben, wenn ein Terminal in einer Regel generiert wurde, kann es nicht mehr ver&amp;auml;ndert werden. &lt;em&gt;Nichtterminale &lt;/em&gt;hingegen sind die &amp;quot;Variablen&amp;quot; aus dem letzten Beitrag. Das sind Hilfssymbole, die wiederum als Ausgangspunkt f&amp;uuml;r weitere Produktionen verwendet werden. Beispiel-Time!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Z ::= &amp;quot;0&amp;quot; | &amp;quot;1&amp;quot; | &amp;quot;2&amp;quot; | &amp;quot;3&amp;quot; | &amp;quot;4&amp;quot; | &amp;quot;5&amp;quot; | &amp;quot;6&amp;quot; | &amp;quot;7&amp;quot; | &amp;quot;8&amp;quot; | &amp;quot;9&amp;quot;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Der vertikale Strich ist als &amp;quot;oder&amp;quot; zu verstehen. Ein &amp;quot;Z&amp;quot; kann nachher in den Regeln mit einer dieser Terminale ersetzt werden. Dann fehlt da formal noch folgendes:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;(G steht f&amp;uuml;r Grammatik, T f&amp;uuml;r Terminale, N f&amp;uuml;r Nichtterminale, S f&amp;uuml;r Startsymbol und P f&amp;uuml;r Produktionsregeln)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;T= {Z} &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Ccap%20%7B%5Cepsilon%7D&quot; title=&quot;\cap {\epsilon}&quot; alt=&quot;\cap {\epsilon}&quot; \/&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;N= {A}&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;P= { S-&amp;gt;ASA, S-&amp;gt;&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cepsilon&quot; title=&quot;\epsilon&quot; alt=&quot;\epsilon&quot; \/&gt;, A-&amp;gt;Z}&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;G = {S,P,N,T}&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Damit h&amp;auml;tten wir eine Grammatik definiert, die eine Sprache generieren kann. Diese Sprache kann ein leeres Wort generieren, denn wir starten bei S und kommen von da aus direkt zum epsilon. Das epsilon ist ein Terminal, von hier aus ginge es also nicht weiter. &lt;br /&gt;&lt;br /&gt;
Die andere S-Regel generiert ASA. Ein A l&amp;auml;sst sich nur ins Terminal aus Z transferieren, also steht da in Wirklichkeit &amp;lt;Zahl&amp;gt;S&amp;lt;Zahl&amp;gt;. Das S in der Mitte wiederum kann man wieder in ein epsilon produzieren (und damit das Wort abbrechen) oder wieder ASA generieren. Die Sprache besteht also aus beliebigen Zahlen, die eine gerade Anazhl von Stellen hat, oder aus dem leeren Wort.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Sch&amp;ouml;n, aber noch nicht perfekt, denn ich k&amp;ouml;nnte damit Zahlen mit f&amp;uuml;hrenden Nullen generieren. Wenn ich das nicht wollte, m&amp;uuml;sste ich ein paar Regeln umschreiben:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Z::= &amp;quot;1&amp;quot; | &amp;quot;2&amp;quot; | &amp;quot;3&amp;quot; | &amp;quot;4&amp;quot; | &amp;quot;5&amp;quot; | &amp;quot;6&amp;quot; | &amp;quot;7&amp;quot; | &amp;quot;8&amp;quot; | &amp;quot;9&amp;quot;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Y::= Z&amp;#160; | &amp;quot;0&amp;quot;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;N= {A,B,C}&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;P= { S-&amp;gt;&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cepsilon&quot; title=&quot;\epsilon&quot; alt=&quot;\epsilon&quot; \/&gt;, S-&amp;gt; ACB, A-&amp;gt; Z, B-&amp;gt; Y, C-&amp;gt; BCB C-&amp;gt;&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cepsilon&quot; title=&quot;\epsilon&quot; alt=&quot;\epsilon&quot; \/&gt;}&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Es wird also etwas komplizierter, aber nicht viel. Wir f&amp;uuml;ren ein paar mehr Regeln und Nichtterminale ein und stellen so sicher, dass gleich nach dem S eine nicht-Null generiert wird. Danach verlassen wir das S und generieren in C weiter. 141592 generiert sich so:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;S-&amp;gt;ACB-&amp;gt;ZCY-&amp;gt;ZBCBY-&amp;gt;ZYBCBYY-&amp;gt;ZYY&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cepsilon&quot; title=&quot;\epsilon&quot; alt=&quot;\epsilon&quot; \/&gt;YYY-&amp;gt;ZYYYYY-&amp;gt;141592&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Das ist also eine kontextreie Sprache, und jetzt kann ich auch erkl&amp;auml;ren, woher das &amp;quot;kontextfrei&amp;quot; kommt. Die Produktionsregeln sind unabh&amp;auml;ngig davon, welches Terminal vor oder hinter einem Nichtterminal steht. Grunds&amp;auml;tzlich kann f&amp;uuml;r ein Nichtterminal jede entsprechende Produktionsregel verwendet werden, ganz unabh&amp;auml;ngig vom &lt;em&gt;Kontext &lt;/em&gt;in dem es steht.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Ich habe noch nicht erkl&amp;auml;rt, was &amp;quot;entscheidbar&amp;quot; bedeutet, deshalb kann ich im Moment auch noch nicht erkl&amp;auml;ren, welches Automatenmodell kontextfreie Sprachen entschieden kann. Im n&amp;auml;chsten Beitrag geht es um deterministische finite Automaten und welche Art Sprache davon entschieden werden k&amp;ouml;nnen. Das mag etwas seltsam anmuten, aber diese Reihenfolge macht schon Sinn. Sowohl Automaten als auch Sprachen f&amp;uuml;hlen sich zu Anfang etwas weit hergeholt an. Dennoch besteht ein so starker Zusammenhang zwischen den beiden, dass es meiner Meinung nach Sinn macht, erst einfache Sprachen zu beschreiben, dann einfache Automaten einzuf&amp;uuml;hren und dann den Zusammenhang herzustellen.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 16 Aug 2007 21:28:00 +0200</pubDate>
    <guid isPermaLink="false">http://zufallsbit.de/blog/index.php?/archives/76-guid.html</guid>
    <category>bnf</category>
<category>formale sprachen</category>
<category>informatik</category>
<category>kontextfrei</category>

</item>
<item>
    <title>Formale Sprachen und ein paar Begriffsklärungen</title>
    <link>http://zufallsbit.de/blog/index.php?/archives/75-Formale-Sprachen-und-ein-paar-Begriffsklaerungen.html</link>
            <category>Informatik</category>
    
    <comments>http://zufallsbit.de/blog/index.php?/archives/75-Formale-Sprachen-und-ein-paar-Begriffsklaerungen.html#comments</comments>
    <wfw:comment>http://zufallsbit.de/blog/wfwcomment.php?cid=75</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://zufallsbit.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=75</wfw:commentRss>
    

    <author>nospam@example.com (Turing)</author>
    <content:encoded>
    &lt;br /&gt;
&lt;p&gt;Dies ist der Eröffnungsbeitrag zur nächsten Serie in diesem Blog. Es wird um formale Sprachen und dem Zusammenhang zwischen Automatenmodellen und diesen Sprachen gehen. Leider gibt es hier kein &amp;quot;Ziel&amp;quot; in dem Sinne wie es eines bei P vs. NP gab, aber der lose Plan ist, früher oder später in die Entscheidbarkeitstheorie abzuschweifen. Da steht dann das Halteproblem an, was ich jetzt einfach mal als vorläufiges Ziel definiere. Aber keine Angst, diese Serie wird etwas praxisrelevanter sein als die P vs. NP-Serie. Und wie immer versuche ich natürlich, möglichst plastische Beispiele zu benutzen.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Schauen wir uns zu diesem Zweck erstmal natürliche Sprachen an. Nehmen wir den Satz &amp;quot;Ich esse Pizza&amp;quot;. Wir erinnern uns an die Regel &amp;quot;Subjekt Prädikat Objekt&amp;quot; aus der Schulzeit. So könnte man diesen Satz formal konstruieren. Das Subjekt wäre &amp;quot;Ich&amp;quot;, also substituiere ich &amp;quot;Ich&amp;quot; mit &amp;quot;Subjekt&amp;quot;. Dann steht da &amp;quot;Ich Prädikat Objekt&amp;quot;. Dann substituiere ich noch Prädikat mit &amp;quot;esse&amp;quot; und Objekt mit &amp;quot;Pizza&amp;quot; und schon steht da &amp;quot;Ich esse Pizza&amp;quot;. Natürlich macht unsere menschliche Intuition das ganze automatisch und viel schneller. Aber ich würde einfach mal ohne Beweis behaupten, dass das Gehirn diese Prozedur trotzdem durchläuft, wenn auch fast unmerklich.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Gut, wir haben also gesehen dass natürliche Sprachen nach gewissen Regeln generiert werden, das ganze kann man natürlich auch formalisieren. Es sei aber vorher erwähnt, dass natürliche Sprachen in der Regel weitaus komplizierter als formale Sprachen sind. Es gibt so viele Sonderregeln und Abweichungen, dass die entsprechende formale Sprache riesig groß und kompliziert wäre. Das ändert aber nichts an der Tatsache, dass natürliche Sprachen im Grunde nur ein Spezialfall einer formalen Sprache ist.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Wie definiert man aber eine Sprache formal? Nun, zunächst brauchen wir ein Alphabet. In Deutsch wäre das vielleicht so etwas wie A = {a,b,...,y,z,A,B,...,Y,Z,ä,ü,ö,Ä,Ü,Ö,ß}. Es gehören außerdem Satzzeichen dazu, denn alles was so allgemein in einem Satz vorkommen kann, muss auch im Alphabet auftauchen.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Machen wir es uns aber etwas einfacher, ohne dabei an Bedeutung zu verlieren. Unser Alphabet ist {A,B,C}. Dann ist ein &amp;quot;Wort&amp;quot; eine Aneinanderreihung von validen Buchstaben, zum Beispiel ABBAC. Der nächste Begriff den wir benötigen ist &amp;quot;Sprache&amp;quot;. Das ist eine Menge von Wörtern, z.B. {AB, AABB,CCC}. Auch das ist analog zu natürlichen Sprachen. Wir könnten auch im deutschen Alphabet z.B. &amp;quot;hudZ8,,&amp;quot; generieren, aber das würde nicht zu unserer Sprache gehören. Genauso könnten wir in der formalen Sprache &amp;quot;ABCCA&amp;quot; generieren, aber das gehört ebenfalls nicht zur Sprache.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Sprachen bezeichnet man in der Regel mit L = {..}, man könnte aber auch unendlich große Sprachen definieren, zum Beispiel als L2={w| w beginnt mit A und endet mit C}. Da steht in Worten: &amp;quot;L2 besteht aus allen Wörtern w, die der Bedingung hinter dem vertikalen Strich genügen&amp;quot;. Diese Sprache wäre also {AC, AAC, ABC ACC, AABC,...}&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Das letzte was ich noch ansprechen möchte sind die so genannten Produktionsregeln. Diese sind ein bischen abhängig vom Typ der Sprache, allgemein kann man aber sagen, dass wir formale Sprachen immer irgendwie generieren wollen. Bisher haben wir das intuitiv gemacht, aber das funktioniert nur begrenzt oft. Nehmen wir L2 und defineren ein paar Hilfssymbole. Zum Beispiel brauchen wir ein Startsymbol, das nicht zur Sprache gehören darf. In der Regel nennt man das &amp;quot;S&amp;quot;. Wenn wir jetzt ein Wort aus der Sprache generieren wollen, fangen wir beim Startsymbol an und schreiben das auf ein Blatt Papier.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Und jetzt kommen die Produktionsregeln ist Spiel. Wir müssen uns ein paar einfach Regeln ausdenken, wie jedes Wort aus L2 zu erzielen ist. Wir wissen schon einmal, dass jedes Wort ein A am Anfang und ein C am Ende haben muss. Was läge also näher als S-&amp;gt; AYC? Wenn man das S auf dem Blatt stehen hat, kann man mit dieser Regel das S in AYC umwandeln. Dabei ist wichtig zu beachten, dass A und C Buchstaben aus dem Alpabet sind und das Y eine Variable. Für diese Variable definieren wir weitere Regeln, denn in der Mitte des Wortes ist es uns egal was da steht. Nehmen wir also Y-&amp;gt;AY, Y-&amp;gt;BY, Y-&amp;gt;CY und &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=Y-%26gt%3B%5Cepsilon&quot; title=&quot;Y-&amp;gt;\epsilon&quot; alt=&quot;Y-&amp;gt;\epsilon&quot; \/&gt;. Die ersten drei Regeln generieren einen Buchstaben und packen wieder ein Y mit rein, so dass wir  wieder irgendeinen Buchstaben generieren können. Die letzte Regel ist eine Spezialregel, denn das epsilon steht für das leere Wort, also ein Wort ohne Buchstaben. Wenn man diese Regeln anwendet endet die Generierung, denn das Y fällt dann raus.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Fassen wir also zusammen:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;A= {A,B,C}, L2={w| w beginnt mit A und endet mit C}&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Produktionsregeln P= { S-&amp;gt; AYC, Y-&amp;gt;AY, Y-&amp;gt;BY, Y-&amp;gt;CY, &lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=Y-%26gt%3B%5Cepsilon&quot; title=&quot;Y-&amp;gt;\epsilon&quot; alt=&quot;Y-&amp;gt;\epsilon&quot; \/&gt;}&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Man kann leicht sehen dass die Produktionregeln die Sprache &lt;em&gt;erzeugen&lt;/em&gt;, aber hier noch ein Beispiel: Generieren wir mal ABAC.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;S-&amp;gt; AYC -&amp;gt;ABYC -&amp;gt; ABAYC -&amp;gt; ABAC. Man beachte, dass bei der letzten Regel das Epsilon einfach wegfällt. Es ist das leere Wort, das taucht nur symbolisch in den Regeln auf, aber nicht im Wort.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Ein Beispiel habe ich noch, diesmal etwas &amp;quot;praxisnäheres&amp;quot;. Das Alphabet A ist A={0,1,&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cepsilon&quot; title=&quot;\epsilon&quot; alt=&quot;\epsilon&quot; \/&gt;} und L3={w| w hat 8 Buchstaben}. Die validen Wörter sind also beliebige Bitstrings mit immer 8 Bits. Das mag nicht spekakulär aussehen, ist aber ganz schön verzwickt. Die Produktionsregeln {S-&amp;gt;0S, S-&amp;gt;1S, S-&amp;gt;&lt;img src=&quot;http://zufallsbit.de/blog/index.php?/plugin/mimetex.php?q=%5Cepsilon&quot; title=&quot;\epsilon&quot; alt=&quot;\epsilon&quot; \/&gt;} funktionieren offensichtlich nicht, denn sie erzeugen Bitstrings beliebiger Länge. Es stellt sich mit ein wenig Nachdenken heraus, dass die einzig möglichen Produktionsregeln aussehen wie {S-&amp;gt;00000000, S-&amp;gt;00000001, ... ,S-&amp;gt;11111111}. Das ist natürlich sehr unschön, denn das sind natürlich 2&lt;sup&gt;8 &lt;/sup&gt;Regeln. Ein Computer allerdings (oder sein theoretischer Gegenpart, die Turingmaschine) kann das ganze in einer simpler Schleife in Millisekunden abarbeiten. Hier ist offensichtlich eine einfach aussehende Sprache strukturell schwieriger als die bisherigen. Und das soll der Cliffhanger für die nächsten Folgen bleiben ;)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Jetzt wo wir also wissen wie man formale Sprachen definiert und generiert, schauen wir uns in einem späteren Posting mal an, was es bedeutet wenn eine Sprache entscheidbar ist und welche Sprachen von Turingmaschinen entscheidbar sind. Später beschäftigen wir uns dann mit anderen Automatenmodellen, Chomsky-Hierachien und vielleicht noch mit Beweismethoden wie dem Pumping-Lemma.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 15 Aug 2007 01:08:00 +0200</pubDate>
    <guid isPermaLink="false">http://zufallsbit.de/blog/index.php?/archives/75-guid.html</guid>
    <category>chomsky</category>
<category>formale sprachen</category>
<category>informatik</category>

</item>

</channel>
</rss>