Kategoriarkiv: Vecktraklet

Den icke-trivialaste trivian du inte vill missa! Semi-regelbundna korta texter, länkar till andra webbsidor och simpla förklarningar på ting.

PyClojuR: En kod ouroboros

Betrakta Python-koden nedan.

s = 's = %r\nprint(s%%s) #Hello'
print(s%s) #Hello

Du kan prova köra den härifrån. Vad händer?

Ett program som skriver ut sin egen källkod utan att fuska kallas för en ’quine’. (Som ’fusk’ räknas direkt uppläsning av programfilen och annat liknande.) Exemplet ovan består av tre delar:

  1. Kod som data. Strängen ’s = %r\nprint(s%%s) #Hello’ innehåller kopian av programmet i text form.
  2. Kod som processerar datan. Notera att all processerande kod befinner sig i någon form i den användbara datan.
  3. Övrig data. Kommentarerna #Hello samt mellanslagen är fullständigt övriga och kan tas bort utan större problem.

Du kanske tänker att quiner är unika för Python-språket, men i själva verket kan man bevisa följande sats:

För alla vettiga programmeringsspråk L existerar det åtminstone ett program P∈ L som skriver ut innehållet av P.

Beviset kan läsas här för dem som är intresserade. I ett nötskal listas alla giltiga program Pi upp, vartefter det bevisas att för varje beräkningsbar funktion h kan man hitta en fixpunkt k så att Pk och Ph(k) är identiska. Genom att välja funktionen h så att Ph(t) skriver ut innehållet av Pt kan man hitta k så att programmet Pk skriver ut innehållet av sig själv.

Utifrån detta presenterar jag Waffes ouroborosprogram teorem (WOooP teoremet):

Givet vettiga programmeringsspråk L1, L2, … Ln  existerar det ett en serie av program P1∈ L1, P2 ∈ L2, … Pn∈ Ln där Pn skriver ut P1, och Pi skriver ut Pi+1.

Programmen P1, P2, … Pn kallas då för ouroborosprogram, namngett efter den mytologiska ormen som äter sin egen svans. Börjandes från Pi får man efter minst n körningar tillbaka det ursprungliga programmet Pi. En quine kan då tänkas vara ett ouroborosprogram på bara ett språk.

För att bevisa WOooP räcker det med att definiera LC som språkens L1, L2, … Ln sammansättning. Man kan sedan använda första satsen för att bevisa att det måste finnas en quine för LC, vilket är ouroborosprogrammet vi söker efter.

Som ett test på mitt teorem skrev jag ett hackigt ouroborosprogram från Python till Clojure till R. Ta gärna och testa för er själva! Koden finns i min git här: code.py.

Alla tre språken har online terminaler, så inget behöver installeras för att testa koden.

P.S. Här är ett lite längre ouroborosprogram på 128 språk.

Minne: Kapitel 1

Pingisbollen seglar genom luften. Riktningen är perfekt, kraften i kastet var perfekt avvägt och den vita plastsfären närmar sig sitt mål. Men muggen är plötsligt borta. Istället slukas bollen av ett skimmer. Norrskenet ökar i styrka och ett öronbedövande hummande fyller rummet. Till sist badar rummet i ett bländande ljus.

Robben slår upp ögonen. Rummet är beckmörkt. Han känner den kalla linoleummattan mot sitt svettiga ansikte. Huvudet känns som om någon slagit in en femtumsspik rakt genom hans pannlob. De enda ljuden i rummet är hans egna hjärtslag som dånar i tinningarna och ett svagt tickande från en klocka på väggen. Den upplysta displayen på hans mullirolex visar 07:31. Mödosamt sätter han sig upp på golvet. Plötsligt går det en kall kår över Robbens rygg: han har ingen väggklocka i sin lägenhet.

Robben blinkar flera gånger för att låta ögonen vänjas vid mörkret. Konturerna av ett skrivbord urskiljer sig och en datorskärms standbylampa lyser rött. Robben hör röster som kommer närmare. Han inser att han måste ut, bort härifrån. Han försöker kvickt komma upp på fötterna men slår huvudet hårt i något. Det svartnar tillfälligt för hans ögon. Det tidigare kolsvarta rummet klyvs nu av en liten ljusstrimma. Någon har tänt lampan utanför. ”Rösterna!”, tänker Robben. Krypande siktar han mot dörren. På andra sidan bländas han av ett fluorescerande ljus. Robben står i en korridor han inte har något minne av. Huvudvärken tilltar. Rösterna närmar sig från höger och Robben skyndar iväg i motsatt riktning. Han svänger runt ett hörn och tacklar nästan en städare. Han försöker få fram ett ”Anteeksi” men munnen är alldeles för torr. Städaren betraktar honom med förvåning och Robben känner hennes blick i ryggen då han springer vidare.

Två dörrar senare stormar Robben slutligen ut i en stor aula. Han känner med ens igen sig, han står på andra våningen i Physicum. Omtöcknad och fortfarande aningen panikslagen fortsätter Robben nästan omedvetet mot sin trygga plats på campus, vardagsrummet utanför hemmet: kafferummet. Utanför caféet på bottenvåningen spyr han i en papperskorg. Det bultar i Robbens öron då han går den korta sträckan till Exactum. ”En Battery skulle sitta riktigt bra just nu” tänker han och försöker återkalla ifall det fanns några kalla i kylskåpet. Samtidigt som han funderar på detta rundar han det sista hörnet. Robben fortsätter till dörren längst bort till höger och tar i dörrhandtaget. Dörren öppnas inte. ”Är den ännu låst?” funderar han, sneglar på klockan och försöker igen. Precis då han är beredd att ge upp ger dörren med sig och öppnas utåt. Robben tror sig minnas att den alltid har öppnats inåt. Grubblandes över detta stiger han in i det mörka rummet och trycker på strömbrytaren.

Kartor, grafer och kaffemuggar

De som har deltagit i gulisintagningen tidigare under hösten känner kanske till muggen ovan. Vid matematikpunkten på Wall Street Bar fick gulisarna till uppgift att med tusch koppla varje hus till varje enhet (el, vatten, gas) utan att förbindelserna korsar varandra. De fick med andra ord lösa det s.k. Three Utilities Problem. Om du vill fundera på problemet själv och undvika spoilers, gör det nu (Eller kolla på 3Blue1Browns video om temat, rekommenderas varmt).

Det väsentliga som gjorde uppgiften lösbar är att en mugg är (topologiskt sett) fundamentalt annorlunda än ett klot eller ett papper. Om man tänker sig att muggen är gjord av lera, kan man utan att bryta den eller slå nya hål forma om den till en donits. Med andra ord är kaffemuggen en torus, en sluten kropp med ett hål. Det visar sig att uppgiften är lösbar på en torus, men inte på ett klot eller ett papper!

 

Muggproblemet kan förvånansvärt nog ge oss insikt om ett helt annat problem: Om du har en karta där varje land är en sammanhängande region, hur många färger behöver du för att färglägga varje land utan att två grannländer får samma färg? Då kartan är ritad på ett papper eller en boll visar det sig att högst fyra färger behövs; resultatet är känt som Four color theorem.

Kartan över Frankrikes provinser behöver fyra färger

Men om kartan är ritad på en annan slags kropp, t.ex. en torus, räcker fyra färger till? För att förstå denna situation bättre söker vi ett ”renare” sätt att rita vår karta. Vi ersätter först varje region med en punkt. Sedan ritar vi streck mellan två punkter ifall de motsvarande regionerna gränsar till varandra. Det vi får är en graf: en samling noder (punkter) och kanter (streck) mellan dessa. I själva verket är det en planär graf, dvs. den kan ritas utan att två streck korsar varandra.

En karta och dess motsvarande graf

Det visar sig att varje karta motsvarar en planär graf och vice versa. Så istället för att granska kartor på en torus, kan vi kolla på planära grafer på en torus: Hur många färger behövs för att färglägga noderna så att två grannar inte får samma färg? Men här kommer insikten från muggproblemet in: Grafen som bildas i Three Utilities Problem är inte planär på ett papper (dvs två kanter måste korsa varandra) men den är planär på en torus. Det betyder att mängden av planära grafer på en torus är fundamentalt större!

Kan vi alltså hitta en graf som kräver mer än fyra färger? Grafen i muggproblemet kan färgas med endast två färger. Men t.ex. den kompletta grafen K5 kräver 5 färger och kan ritas på en kaffemugg utan att två kanter korsar varandra.

K5 ritad på en kaffemugg utan att två kanter korsar

Och vad är det högsta antalet färger vi kan behöva?
https://mathsgear.co.uk/products/7-colour-torus-mug

Det mest spännande inom matematiken är då två koncept som verkar mycket annorlunda egentligen är nära sammankopplade. Många situationer där vi beaktar föremål (länder) och förbindelser mellan dem (gränser) kan uttryckas med hjälp av grafteori. Men en grafs egenskaper hänger inte bara på grafen själv, utan också på kroppen den ritas på. Kaffemuggen är ett intressant topologiskt föremål, inte bara en pryl för att hälla i sig kaffe.