Primitivt rekursiva funktioner och den aritmetiska hierarkin Rasmus Blanck 0 Inledning En rad frågor inom logiken, matematiken och datavetenskapen relaterar till begreppet beräkningsbarhet. En del i kursen är att ge en formell specifikation av vad beräkningsbarhet kan betyda, men vi kommer också att hänvisa till en informell förståelse av begreppet: En funktion är beräkningsbar om det finns en mekanisk metod (algoritm, program, maskin, etc) som beräknar funktionen. Att metoden är mekanisk betyder att det inte skall krävas någon kreativitet vid använding av metoden; den skall kunna utföras någon vidare eftertanke. Att visa att en funktion är beräkningsbar är alltså att beskriva de regler efter vilka funktionsvärdet beräknas. För att detta skall bli formellt återstår såklart att beskriva precis vad som kan räknas som regel, eller algoritm eller mekanisk metod. Denna specifikation återfinns i materialet ur Boolos & Jeffrey. Denna lilla text ger istället en introduktion till en klass av beräkningsbara funktioner, de primitivt rekursiva funktionerna, och relaterar även dessa till aritmetiska teorier och andra beräkningsbarhetsbegrepp. Vi visar också att de primitivt rekursiva funktionerna inte uttömmer de beräkningsbara funktionerna: Det finns alltså beräkningsbara funktioner som inte är primitivt rekursiva. 1 Primitivt rekursiva funktioner och Q När vi introducerade språket och axiomen för Peanos aritmetik (och Q) så introducerade vi bara två funktionssymboler: + och. Aritmetiken verkar dock vara full av andra intressanta funktioner, till exempel x 2, x! och så vidare. Vi skall titta närmare på hur dessa, och andra, funktioner kan definieras på ett generellt sätt i termer av enklare funktioner. 1.1 Ett första exempel Ta till exempel axiomen för addition: x + 0 = x x + S(y) = S(x + y) Vi verkar (behöva) definiera hur additionssymbolen skall uppföra sig genom att titta på två separata fall: Dels hur addition fungerar när vi adderar noll, dels hur vi skall hantera mer komplexa additioner. Högersidan i det andra axiomet 1
är enklare än vänstersidan i den meningen att det är närmare den minimala addition som specificeras i det första axiomet. Låt oss titta på ett exempel för att förstå vad det är som är på gång. För att beräkna till exempel funktionsvärdet 3 + 2 med hjälp av den axiomen ovan går vi till väga på följande sätt. 1 Vi konstaterar att uttrycket är på formen x+s(y), då talet två är ett så kallat efterföljartal (nämligen det tal som kommer efter ett). Enligt det andra axiomet är x + S(y) = S(x + y), vilket i vårt fall ger 3 + S(1) = S(3 + 1). Detta förefaller ju intuitivt riktigt, då tre plus efterföljaren till ett (dvs två) är samma tal som efterföljaren till tre plus ett. Funktionsvärdet är alltså S(3 + 1), men vi är inte klara där. På samma sätt som innan konstaterar vi att ett är ett efterföljartal, så vi kan (återigen med hjälp av det andra axiomet) skriva om uttrycket som S(S(3 + 0)), alltså det tal som är efterföljaren till efterföljaren till tre. Men det andra axiomet säger oss att 3 + 0 = 3, och om vi drar oss till minnes att siffor egentligen uttrycks enbart med hjälp av successorfunktionen och konstanten 0, så får vi uttrycket S(S(S(S(S(0))))). Denna siffra står för talet fem, vilket ju är den korrekta summan av tre och två. 1.2 Primitiv rekursion Allt detta kan förstås framstå som tramsigt, givet att vi redan kan beräkna additioner. I själva verket verkar det ju svårare att beräkna värdet av additionsfunktionen på detta sätt, istället för att addera som vanligt. Att ge reglerna för hur addition går till verkar däremot svårare om vi inte accepterar definitioner som till exempel axiomparet ovan. En annan fördel är att varje funktion som är definierad på detta sätt kan beräknas i ett ändligt antal steg (och dessutom i ett antal steg som är begränsat av en funktion av argumentens storlek). I vårt exempel definierades alltså additionsfunktionen i två steg: först ett basfall, och sedan ett rekursivt steg. Denna typ av falluppdelning kallas primitiv rekursion, och vi ger följande generella definition: Definition 1. Om f(x, 0) = g(x) f(x, Sy) = h(x, y, f(x, y)) så är f definierad från g och h med hjälp av primitiv rekursion. Om vi nu vill visa att vår additionsfunktion faktiskt faller under denna generella form, hur skall detta gå till? 2 Vi behöver hitta funktioner g och h som gör det jobb som vi specificerat i axiomen. Funktionen g(x), till exempel, skall ge x som utdata. Vi behöver alltså en funktion som inte gör något mer än returnerar sitt eget argument. Kalla denna identitetsfunktion för I1 1 (x). (Varför den heter så kommer att klarna framöver.) Vad skall h göra? Enligt axiomet skall funktionsvärdet vara S(x, y). Men det tredje argumentet till h, f(x, y), är 1 Kom ihåg att PA inte innehåller några konstanter för andra tal än 0, så alla termer är på formen S(S(S(...S(0)))...). För att textens alls skall gå att läsa kommer vi dock att använda de vanliga beteckningarna på talen, även i de fall då det rent formellt skall stå siffror, det vill säga termer på formen ovan. 2 Detta är något av en historisk kullerbytta. I själva verket så är det de specifika formerna hos additions- och multiplikationsfunktionerna som gett upphov till den generella definitionen av primitiv rekursion. 2
ju precis ett mindre än f(x, Sy) (och därmed ett mindre än x + Sy) så vi vill att funktionsvärdet skall vara S(f(x, y)). Därför behöver dels vi en funktion som returnerar sitt tredje argument (en generaliserad identitetsfunktion, eller en projektionsfunktion). Kalla denna funktion I3 3 (x 1, x 2, x 3 ). Låt nu slutligen h vara kompositionen av S(x) och I3 3 (x, y, f(x, y)), dvs S(I3 3 (x, y, f(x, y))). Frågan är nu vilka funktioner vi skall tillåta som byggstenar för den klass av primitivt rekursiva funktioner som vi vill definiera. En tanke är att det endast är från primitivt rekusriva funktioner som vi kan bygga nya primitivt rekursiva funktioner, men denna kedja måste bottna någonstans. Lösningen är att specificera en uppsättning mycket enkla funktioner, som nästan inte beräknar någonting alls, och utgå från dem. Vi har redan sett att identitetsfunktionen (och projektionsfunktioner) verkar behövas för att passa definitionen, och identitetsfunktionen kan ju anses inte utföra någon beräkning alls. Till slut bestämmer vi oss för denna uppsättning funktioner som elementära byggstenar: 1. Nollfunktionen: Z(x) = 0, 2. Successorfunktionen: S(k) = k + 1, 3. Projektionsfunktioner (en för varje j, k, k j): I j k (x 1,..., x j ) = x k. Dessa funktioner kallar vi initialfunktioner, och konstaterar glatt att de är oändligt många. Det behövs nämligen n varianter av varje n-ställig projektionsfunktion. Låt nu klassen av primitivt rekursiva funktioner definieras som följer: 1. Initialfunktionerna är primitivt rekursiva, 2. om f(x) och g(x) är primitivt rekursiva så är kompositionen (sammansättningen) av f och g, f(g(x)) primitivt rekursiv, 3. om h definieras med hjälp av primitiv rekursion från primitivt rekursiva f och g, så är f primitivt rekursiv. 4. (Inget annat är en primitivt rekursiv funktion.) Nu går det att visa att en rad intressanta aritmetiska funktioner och relationer är primitivt rekursiva (p.r.). Alla vanliga skolboksaritmetiska funktioner är till exempel p.r., men det finns även (för våra syften) mycket mer intressanta p.r. funktioner. Att additionsfunktionen kan definieras med hjälp av primitiv rekursion från initialfunktionerna visas av följande par av likheter. +(x, 0) = I 1 1 (x) +(x, Sy) = S(I 3 3 (x, y, +(x, y))) När vi nu visat att addition är p.r. så kan vi definiera multiplikation i termer av addition på följande vis: (x, 0) = Z(x) (x, Sy) = +(I 3 3 (x, y, (x, y)), I 3 1 (x, y, (x, y))) Tillåter vi oss att skriva (x, y) på det mer naturliga sättet x y kan vi utläsa den första raden som x 0 = 0, och den andra raden som x Sy = x y + x. 3
1.3 Karaktäristiska funktioner Vi vill också kunna tala om mängder och relationer som primitivt rekursiva. Kopplingen går via följande definition: Givet en mängd X så säger vi att f X är en karaktäristisk funktion för X om följande gäller: f X (k) = 1 om k X f X (k) = 0 om k / X (1) Funktionen f X svarar alltså ja om k faktiskt är ett element i X och nej annars. Givet denna definition kan vi utöka p.r.-begreppet till att utöver funktioner även handla om mängder. En p.r. mängd är alltså en mängd vars karaktäristiska funktion är p.r. På liknande sätt kan vi tala om p.r. relationer: en relation är p.r. om mängden som utgör relationens extension är p.r. Givet en gödelnumrering kan vi nu bilda till exempel mängden av gödelnummer för termer i första ordningens aritmetik. Gödel visade att denna mängd är primitivt rekursiv, det vill säga att mängden av termer har en p.r. karaktäristisk funktion. Det är alltså lätt att kolla om en given symbolsekvens är en term. Motsvarande gäller för mängden av formler. Vad som är ännu mer intressant är att relationen y är ett bevis för x i T också är primitivt rekursiv. Givet gödelnumret för en sats x och gödelnumret för en sekvens av satser y så kan vi kolla om y faktiskt är ett bevis för x eller ej. Idén är att vi (givet en gödelnumrering) kan ta reda på om en given siffra är kod för ett axiom i PA eller ej. På motsvarande sätt kan vi, för varje härledningsregel, se efter om en given sats är resultatet av att tillämpa härledningsregeln på en annan sats. Eftersom vi dessutom kan gödelnumrera sekvenser av satser kan vi alltså ta reda på om en given sekvens av satser är ett bevis, det vill säga har konstruerats i enlighet med de härledningsregler vi enats om. Detaljerna bakom detta är dock snåriga, varför vi utelämnar dem. 1.4 Diagonalisering När vi nu konstaterat att en mängd aritmetiska funktioner är primitivt rekursiva är det naturligt att ställa sig frågan om det gäller alla aritmetiska funktioner. Svaret är nej: Det finns (intuitivt) beräkningsbara funktioner som inte är primitivt rekursiva. Skapa först en lista innehållande alla primitivt rekursiva funktioner: f 0, f 1, f 2, f 3,... (Detta låter sig göras. Fundera gärna över varför.) Sedan definierar vi en ny funktion, δ(x), på följande vis: δ(x) = f x (x) + 1. Funktionsvärdet för till exempel δ(k) får vi genom att leta upp funktion nummer k i listan ovan, ge den funktionen indata k, och lägga till ett till resultatet. δ(k) är alltså lika med f k (k) + 1. Givet att varje f k är beräkningsbar (vilket vi har antagit) så är också δ beräkningsbar. Vi kan lätt konstatera att δ inte kan vara samma funktion som f k, eftersom δ(k) = f k (k) + 1. Vore de samma skulle vi kunna härleda att 0 = 1... I själva verket följer det att δ inte kan vara någon av de funktioner vi listat! Eftersom vi listat alla p.r. funktioner, så skiljer sig δ från varje p.r. funktion på 4
åtminstone ett ställe. Den kan ju inte vara f 0, eftersom δ(0) = f 0 (0) + 1, och den kan inte heller vara f 1 eftersom δ(1) = f 1 (1) + 1, och så vidare. Alltså är δ en beräkningsbar funktion som inte är primitivt rekursiv. Om vi funderar kring hur definitionen av en p.r. funktion ser ut så kanske vi får lite klarhet i vad det är som händer. En sådan funktion beskriver ju hur vi i små (enkla) steg beräknar en funktion, genom att förenkla varje uttryck till något som efter ett ändligt antal steg bottnar i en initialfunktion, men något sådant verkar vi inte kunna göra här. Vi skulle i så fall behöva koda alla p.r. funktioner i δ och låta δ beräkna radikalt olika saker beroende på vilken siffra vi ger som indata, och det är något som helt enkelt inte låter sig göras. Detta betyder bland annat att begreppet primitivt rekursiv inte verkar vara en fruktbar explikation av det informella begreppet beräkningsbar ; beräkningsbarhet är ett vidare begrepp än primitiv rekursivitet. 2 Den aritmetiska hierarkin Den aritmetiska hierarkin är en klassificering av aritmetiska formler i termer av kvantifikatorkomplexitet. Vi kommer att använda denna klassificering för att knyta ihop primitivt rekursiva funktioner med uttryck i Q. Låt oss definiera en atomär 0 -formel som endera av t 1 = t 2 eller t 1 t 2, där t 1 och t 2 är termer. Sedan har vi följande definition: Definition 2. Mängden av 0 -formler är den minsta mängd som innehåller de atomära 0 -formlerna, och som är sluten under satslogik och begränsad kvantifikation. Detta betyder alltså att om ϕ och ψ är (atomära) 0 -formler, så är till exempel ψ, ϕ ψ, x kψ och y yϕ 0 -formler. Vidare säger vi att en formel är Σ 1 om den har formen x 0... x n ϕ, där ϕ är en 0 -formel, och analogt att en formel är Π 1 om den har formen x 0... x n ψ, där ψ är en 0 -formel. Detta generaliserar på så vis att om ϕ är en Σ n -formel, så är x 0... x n ϕ en Π n+1 -formel (och omvänt för Π n -formler). Den tänkta förståelsen av detta är att till exempel en Σ 3 -formel är en formel som börjar med en obruten sekvens av existenskvantifikatorer, följd av en obruten sekvens av allkvantifikatorer, ytterligare en sekvens existenskvantifikatorer och slutligen en 0 -formel. En Π 3 -formel börjar istället med en sekvens av allkvantifikatorer, följd av existenskvantifikatorer, allkvantifikatorer och en 0 -formel. Dessutom gäller att om ϕ är en Σ n -formel så är ϕ en Π n -formel (och tvärtom). Här följer ett mycket informellt argument för att det finns en metod för att avgöra sanningsvärdet hos varje 0 -formel. Om ϕ är en atomär 0 -formel så är ϕ antingen en formel på formen t 1 = t 2 eller t 1 t 2. Det enda vi behöver göra för att avgöra sanningsvärdet hos en sådan formel är alltså att beräkna termerna var för sig (de är ju uppbyggda av 0, S, +, och dessa funktioner har vi rekursiva definitioner av) och se om värdet hos termerna är lika eller olika. Är formeln istället konstruerad med hjälp av satslogik så beräknar vi först termernas värde och använder sedan sanningsvärdestabeller för att avgöra formelns sanningsvärde. Skulle formeln innehålla en begränsad kvantifikator får vi kanske fundera lite mer. Uttrycket x k betyder intuitivt att det skall finnas ett x som är mindre än en given siffra k, för vilken satsen som kommer efter skall gälla. Men just 5
på grund av denna begränsning räcker det att vi successivt går igenom siffrorna från 0 till k och kollar satsen sanningsvärde i varje fall. Om satsen är sann för något tal vi tittar på, ja, då finns det ju ett x k för vilket satsen är sann. På motsvarande sätt kan vi argumentera för en begränsad allkvantifikator, men då skall formeln gälla för varje x k. Detta argument går att genomföra i Q, då denna teori är stark nog att kunna beräkna termers värde och jämföra dem. Givet att teorin dessutom har sanna axiom betyder det att Q korrekt avgör varje 0 -sats, det vill säga att om ϕ är en 0 -sats så Q ϕ omm ϕ är sann. Vi kan förbättra detta argument på två sätt. Å ena sidan gäller det att varje teori som har sanna axiom och ett sunt härledningssystem bara bevisar sanna satser, det vill säga att varje sats som Q faktiskt bevisar är sann. Å andra sidan kan vi visa att Q bevisar alla sanna Σ 1 -satser. En Σ 1 -sats är som bekant på formen xψ(x), där ψ är 0. Antag nu att xψ(x) är en sann Σ 1 - sats. 3 Att denna sats är sann betyder att det finns en siffra k som är sådan att ψ(k) är sann. Men ψ(k) är en 0 -sats, så Q avgör denna sats, och eftersom ψ(k) enligt antagandet är sann så gäller Q ψ(k). Med en applikation av existenskvantifikatorintroduktion (eller annan lämplig härledningsregel) följer nu att Q xψ(x). Detta leder oss att formulera följande teorem: Teorem 1. Q är Σ 1 -fullständig, det vill säga att för varje Σ 1 -sats ϕ gäller att Q ϕ omm ϕ är sann. 2.1 Att fånga funktioner Givet en funktion f(x) så säger vi att ϕ(x, y) uttrycker f om, för varje m och n, om f(m) = n så är ϕ(m, n) sann, och om f(m) n) så är ϕ(m, n) falsk. Givet detta kan vi nu utöka Σ n - och Π n -klassificeringen till att handla om funktioner: En funktion är till exempel Σ n om den uttrycks av en Σ n -formel. Vidare säger vi att en funktion f(x) fångas av ϕ(x, y) i T om, för varje m och n, om f(m) = n så T ϕ(m, n), om f(m) n) så T ϕ(m, n). En förutättning för att en teori skall kunna fånga en funktion är att (det aritmetiska) språket är tillräckligt uttrycksfullt för att kunna uttrycka funktionen, annars skulle det inte ens finnas någon formel som kunde vara kandidat till att fånga funktionen. Återigen utelämnar vi detaljer, men språket kan i alla fall uttrycka alla primitivt rekursiva funktioner. Teorem 2. Varje primitivt rekursiv funktion är Σ 1. Bevisidé. Den grundläggande idén är att varje p.r. funktion kan skrivas som en komposition av två 0 -funktioner. Nästa steg är att visa att varje komposition av två 0 -funktioner är (högst) Σ 1. 3 För klarhets skull antar vi att x är den enda fria variabeln i ψ. Resultatet är lätt att generalisera till formler med fler variabler. 6
Teorem 3. Q fångar alla Σ 1 -funktioner. Bevisskiss. Antag att f(x) uttrycks av Σ 1 -formeln ϕ(x, y). Om f(k) = m så är ϕ(k, m) sann, men eftersom ϕ är Σ 1 och Q är Σ 1 -fullständig, så Q ϕ(k, m). Korollarium 1. Q fångar alla primitivt rekursiva funktioner. I slutet av sektion 1.3 konstaterade vi att relationen y är ett bevis för x är primitivt rekursiv. Enligt korollariet ovan följer alltså att det finns en Σ 1 -formel Prf(x, y) som är sådan att Q Prf(x, y) när y är ett bevis för x, och Q Prf(x, y) när y inte är ett bevis för x. 7