{"id":2304,"date":"2018-10-16T12:41:52","date_gmt":"2018-10-16T09:41:52","guid":{"rendered":"http:\/\/spektrum.fi\/spektraklet\/?p=2304"},"modified":"2018-10-16T12:41:52","modified_gmt":"2018-10-16T09:41:52","slug":"pyclojur-en-kod-ouroboros","status":"publish","type":"post","link":"https:\/\/spektrum.fi\/spektraklet\/pyclojur-en-kod-ouroboros\/","title":{"rendered":"PyClojuR: En kod ouroboros"},"content":{"rendered":"<p>Betrakta Python-koden nedan.<\/p>\n<pre><span class=\"n\">s<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'s = <\/span><span class=\"si\">%r<\/span><span class=\"se\">\\n<\/span><span class=\"s1\">print(s<\/span><span class=\"si\">%%<\/span><span class=\"s1\">s) #Hello'<\/span>\r\n<span class=\"k\">print<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"o\">%<\/span><span class=\"n\">s<\/span><span class=\"p\">)<span class=\"s1\"> #Hello<\/span><\/span><\/pre>\n<p>Du kan prova k\u00f6ra den <a href=\"https:\/\/repl.it\/repls\/DigitalMatureBots\">h\u00e4rifr\u00e5n<\/a>. Vad h\u00e4nder?<\/p>\n<p>Ett program som skriver ut sin egen k\u00e4llkod utan att fuska kallas f\u00f6r en &#8217;quine&#8217;. (Som &#8217;fusk&#8217; r\u00e4knas direkt uppl\u00e4sning av programfilen och annat liknande.) Exemplet ovan best\u00e5r av tre delar:<\/p>\n<ol>\n<li>Kod som data. Str\u00e4ngen\u00a0<em><span class=\"s1\">&#8217;s = <\/span><span class=\"si\">%r<\/span><span class=\"se\">\\n<\/span><span class=\"s1\">print(s<\/span><span class=\"si\">%%<\/span><\/em><span class=\"s1\"><em>s) #Hello&#8217;<\/em> inneh\u00e5ller kopian av programmet i text form.<\/span><\/li>\n<li>Kod som processerar datan. Notera att all processerande kod befinner sig i n\u00e5gon form i den anv\u00e4ndbara datan.<\/li>\n<li>\u00d6vrig data. Kommentarerna <span class=\"s1\"><em>#Hello<\/em> samt mellanslagen \u00e4r fullst\u00e4ndigt \u00f6vriga och kan tas bort utan st\u00f6rre problem.<\/span><\/li>\n<\/ol>\n<p>Du kanske t\u00e4nker att quiner \u00e4r unika f\u00f6r Python-spr\u00e5ket, men i sj\u00e4lva verket kan man bevisa f\u00f6ljande sats:<\/p>\n<p style=\"padding-left: 30px\"><em>F\u00f6r alla <a href=\"https:\/\/en.wikipedia.org\/wiki\/Turing_completeness\">vettiga<\/a> programmeringsspr\u00e5k\u00a0L existerar det \u00e5tminstone ett program P\u2208 L som skriver ut inneh\u00e5llet av P.<\/em><\/p>\n<p>Beviset kan l\u00e4sas <a href=\"http:\/\/www.madore.org\/~david\/computers\/quine.html#sec_fp\">h\u00e4r<\/a> f\u00f6r dem som \u00e4r intresserade. I ett n\u00f6tskal listas alla giltiga program P<sub>i<\/sub> upp, vartefter det bevisas att f\u00f6r varje ber\u00e4kningsbar funktion <em>h<\/em> kan man hitta en fixpunkt <em>k<\/em> s\u00e5 att\u00a0P<sub>k<\/sub> och\u00a0P<sub>h(k)<\/sub> \u00e4r identiska. Genom att v\u00e4lja funktionen <em>h<\/em>\u00a0s\u00e5 att P<sub>h(t)<\/sub> skriver ut inneh\u00e5llet av P<sub>t<\/sub> kan man hitta <em>k<\/em> s\u00e5 att programmet P<sub>k<\/sub> skriver ut inneh\u00e5llet av sig sj\u00e4lv.<\/p>\n<p>Utifr\u00e5n detta presenterar jag Waffes <a href=\"https:\/\/en.wikipedia.org\/wiki\/Quine_(computing)#Ouroboros_programs\">ouroborosprogram<\/a> teorem (WOooP teoremet):<\/p>\n<p style=\"padding-left: 30px\"><em>Givet vettiga programmeringsspr\u00e5k L<sub>1<\/sub>,\u00a0L<sub>2<\/sub>, &#8230; L<sub>n<\/sub>\u00a0 existerar det ett en serie av program P<sub>1<\/sub>\u2208 L<sub>1<\/sub>, P<sub>2<\/sub> \u2208 L<sub>2<\/sub>, &#8230; P<sub>n<\/sub>\u2208\u00a0L<sub>n<\/sub> d\u00e4r P<sub>n<\/sub> skriver ut P<sub>1<\/sub>, och P<sub>i<\/sub> skriver ut P<sub>i+1<\/sub>.<\/em><\/p>\n<p>Programmen P<sub>1<\/sub>, P<sub>2<\/sub>, &#8230; P<sub>n<\/sub> kallas d\u00e5 f\u00f6r <a href=\"https:\/\/en.wikipedia.org\/wiki\/Ouroboros\">ouroboros<\/a>program, namngett efter den mytologiska ormen som \u00e4ter sin egen svans. B\u00f6rjandes fr\u00e5n P<sub>i<\/sub> f\u00e5r man efter minst n k\u00f6rningar tillbaka det ursprungliga programmet P<sub>i<\/sub>. En quine kan d\u00e5 t\u00e4nkas vara ett ouroborosprogram p\u00e5 bara ett spr\u00e5k.<\/p>\n<p><a href=\"http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/10\/cropped-ouroboros512.png\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-2320 size-full\" src=\"http:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/10\/cropped-ouroboros512.png\" alt=\"\" width=\"512\" height=\"512\" srcset=\"https:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/10\/cropped-ouroboros512.png 512w, https:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/10\/cropped-ouroboros512-150x150.png 150w, https:\/\/spektrum.fi\/spektraklet\/wp-content\/uploads\/2018\/10\/cropped-ouroboros512-300x300.png 300w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/a><\/p>\n<p>F\u00f6r att bevisa WOooP r\u00e4cker det med att definiera L<sub>C<\/sub> som spr\u00e5kens\u00a0L<sub>1<\/sub>, L<sub>2<\/sub>, &#8230; L<sub>n<\/sub> sammans\u00e4ttning. Man kan sedan anv\u00e4nda f\u00f6rsta satsen f\u00f6r att bevisa att det m\u00e5ste finnas en quine f\u00f6r L<sub>C<\/sub>, vilket \u00e4r ouroborosprogrammet vi s\u00f6ker efter.<\/p>\n<p>Som ett test p\u00e5 mitt teorem skrev jag ett hackigt ouroborosprogram fr\u00e5n Python\u00a0till Clojure till R.\u00a0Ta g\u00e4rna och testa f\u00f6r er sj\u00e4lva! Koden finns i min git h\u00e4r: <a href=\"https:\/\/bitbucket.org\/WaffeFIN\/pyclojur\/src\/master\/code.py\">code.py<\/a>.<\/p>\n<p>Alla tre spr\u00e5ken har <a href=\"https:\/\/repl.it\/\">online terminaler<\/a>, s\u00e5 inget beh\u00f6ver installeras f\u00f6r att testa koden.<\/p>\n<p>P.S. H\u00e4r \u00e4r ett lite l\u00e4ngre<a href=\"https:\/\/github.com\/mame\/quine-relay\">\u00a0ouroborosprogram p\u00e5 128 spr\u00e5k<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Betrakta Python-koden nedan. s = &#8217;s = %r\\nprint(s%%s) #Hello&#8217; print(s%s) #Hello Du kan prova k\u00f6ra den h\u00e4rifr\u00e5n. Vad h\u00e4nder? Ett program som skriver ut sin egen k\u00e4llkod utan att fuska kallas f\u00f6r en &#8217;quine&#8217;. (Som &#8217;fusk&#8217; r\u00e4knas direkt uppl\u00e4sning av programfilen och annat liknande.) Exemplet ovan best\u00e5r av tre delar: Kod som data. Str\u00e4ngen\u00a0&#8217;s = &hellip; <a href=\"https:\/\/spektrum.fi\/spektraklet\/pyclojur-en-kod-ouroboros\/\" class=\"more-link\">Forts\u00e4tt l\u00e4sa <span class=\"screen-reader-text\">PyClojuR: En kod ouroboros<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":13,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[87,42],"tags":[53],"_links":{"self":[{"href":"https:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/posts\/2304"}],"collection":[{"href":"https:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/comments?post=2304"}],"version-history":[{"count":28,"href":"https:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/posts\/2304\/revisions"}],"predecessor-version":[{"id":2338,"href":"https:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/posts\/2304\/revisions\/2338"}],"wp:attachment":[{"href":"https:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/media?parent=2304"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/categories?post=2304"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spektrum.fi\/spektraklet\/wp-json\/wp\/v2\/tags?post=2304"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}