Rekursiv funktion (beräkningsbarhetsteori)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 4 juni 2021; kontroller kräver 2 redigeringar .

Termen rekursiv funktion i beräkningsteorin används för att hänvisa till tre klasser av funktioner:

Det senare sammanfaller med klassen av Turing-beräknade funktioner . Definitionerna av dessa tre klasser är starkt relaterade. De introducerades av Kurt Gödel för att formalisera begreppet beräkningsbarhet.

Uppsättningen av partiellt rekursiva funktioner inkluderar uppsättningen generella rekursiva funktioner, och de generella rekursiva funktionerna inkluderar primitiva rekursiva funktioner. Partiellt rekursiva funktioner kallas ibland helt enkelt rekursiva funktioner.

Primitiv rekursiv funktion

Definition

Definitionen av begreppet primitiv rekursiv funktion är induktiv . Den består av att specificera en klass av grundläggande primitiva rekursiva funktioner och två operatorer ( superposition och primitiv rekursion ) som tillåter att bygga nya primitiva rekursiva funktioner baserat på befintliga.

De grundläggande primitiva rekursiva funktionerna inkluderar följande tre typer av funktioner:

Substitutions- och primitiva rekursionsoperatorer definieras enligt följande:

I denna definition kan en variabel förstås som en iterationsräknare, — som en initial funktion i början av iterationsprocessen, som utfärdar en viss sekvens av funktioner av variabler, som börjar med , och — som en operator som accepterar som indatavariabler , iterationsstegsnummer , en funktion vid ett givet iterationssteg och returnerande funktion i nästa steg av iterationen.

Uppsättningen av primitiva rekursiva funktioner är den minimala uppsättningen som innehåller alla grundläggande funktioner och stängd under de specificerade substitutions- och primitiva rekursionsoperatorerna.

När det gäller imperativ programmering motsvarar primitiva rekursiva funktioner programblock som endast använder aritmetiska operationer, såväl som en villkorlig operator och en aritmetisk loopoperator (en loopoperator där antalet iterationer är känt vid den tidpunkt då slingan startar). Om programmeraren börjar använda loopoperatorn while, där antalet iterationer inte är känt i förväg och i princip kan vara oändligt, går han över i klassen med delvis rekursiva funktioner.

Exempel

Låt oss peka på ett antal välkända aritmetiska funktioner som är primitivt rekursiva.

; ; . ; ; . ; ; ; ; ;

Delvis rekursiv funktion

En partiellt rekursiv funktion definieras på samma sätt som en primitiv rekursiv, endast för två operatorer, superposition och primitiv rekursion, en tredje operator läggs till - argumentminimering.

, På villkor Det vill säga, funktionen returnerar minimivärdet för det sista argumentet för funktionen , vid vilket dess värde är 0.

Delvis rekursiva funktioner för vissa argumentvärden kanske inte definieras, eftersom argumentminimeringsoperatorn inte alltid är korrekt definierad, eftersom funktionen kanske inte är lika med noll för några argumentvärden. Ur imperativ programmeringssynpunkt kan resultatet av en delvis rekursiv funktion inte bara vara ett tal, utan också ett undantag eller en oändlig slinga som motsvarar ett odefinierat värde.

Allmän rekursiv funktion

En allmän rekursiv funktion är en delvis rekursiv funktion definierad för alla argumentvärden. Problemet med att avgöra om en delvis rekursiv funktion med en given beskrivning är generell rekursiv eller inte är algoritmiskt oavgörbart .

Egenskaper

Det är lätt att förstå att varje primitiv rekursiv funktion är delvis rekursiv, eftersom operatorerna för att konstruera delvis rekursiva funktioner per definition inkluderar operatorerna för att konstruera primitiva rekursiva funktioner.

Det är också tydligt att en primitiv rekursiv funktion definieras överallt och därför är en allmän rekursiv funktion (en primitiv rekursiv funktion har ingen anledning att "hänga", eftersom dess konstruktion använder operatorer som definierar funktioner definierade överallt).

Det är ganska svårt att bevisa existensen och ge ett exempel på en generell rekursiv funktion som inte är primitivt rekursiv. Ett populärt exempel är Ackermann-funktionen . Ett annat exempel på en allmän rekursiv funktion som inte är primitiv rekursiv är konstruerad av Cantors diagonalmetod från en universell funktion för en uppsättning unära primitiva rekursiva funktioner.

Som visades av Gödel sammanfaller delvis rekursiva funktioner med uppsättningen av beräkningsbara funktioner .

Namnhistorik

Termerna "partially rekursiv funktion" och "generell rekursiv funktion" har slagit rot av historiska skäl och är i huvudsak resultatet av en felaktig översättning av de engelska termerna partiell rekursiv funktion och total rekursiv funktion , som mer korrekt översatts som "rekursiva funktioner definierade på delar av uppsättningen av möjliga argument ” och “rekursiva funktioner definierade på hela uppsättningen av möjliga argument”. Adverbet "delvis" syftar inte på adjektivet "rekursivt", utan till funktionens omfattning . Ett mer korrekt namn skulle kanske vara "delvis definierade rekursiva funktioner" och helt enkelt "överallt definierade rekursiva funktioner". Men långa namn slog inte rot.

Se även

Litteratur