Primitiivirekursiiviset funktiot

Yleistä

1900-luvun alkupuoli oli matemaattisen logiikan kulta-aikaa, jolloin suuret matemaatikot, kuten Alan Turing (1912-1954), Kurt Gödel (1906-1978), Alonzo Church (1903-1995), Emil Post (1897-1954) ja useat muut kehittivät useita matemaattisia malleja, jotka mallinsivat nykyaikaisia tietokoneita ennen kuin niitä oli varsinaisesti rakennettu. Samalla pystyttiin jo ennen tietokoneiden keksimistä päättelemään, mitä on tietokoneella laskettavissa ja mitä ei, vaikka resursseja olisi kuinka paljon. Alan Turing tunnettiin erityisesti Turingin koneesta, joka vastaa tietokonetta, jolla on nauhamainen muisti, rekistereitä ja lukupää. Emil Post vastaavasti oli merkkijonojärjestelmien uranuurtaja, Alonzo Church kehitti sittemmin λ-laskentana tunnetun järjestelmän, joka simuloi sitä, kuinka tietokoneohjelmien funktiot ottavat parametreja ja käsittelevät niitä. Church teki erityisen tunnetuksi konseptin, jossa funktiot voivat ottaa parametreikseen toisia funktioita, mikä nykyään tunnetaan funktionaalisena ohjelmointina, ollen käytössä useissa nykyaikaisissa Javascript-kirjastoissa, kuten React.JS:ssä. Kurt Gödel keksi yksinkertaisehkot määritelmät lukuteoreettisille funktioille, sekä järjestelmän, jolla lukupareja, useamman luvun listoja tai merkkijonoja voidaan koodata luonnollisiksi luvuiksi. Tällainen systeemi on nykyään käytössä esimerkiksi UTF-8-merkistökoodauksessa. Tämä artikkeli käsittelee lukuteoreettisten funktioiden merkittävää osajoukkoa, primitiivirekursiivisia funktioita.

Primitiivirekursiivisten funktioiden määritelmä

Primitiivirekursiiviset funktiot ovat eräitä funktioita nollan tai useamman luonnollisen luvun listalta yhdelle luonnolliselle luvulle. Funktiot tyhjältä listalta luonnolliselle luvuille ovat luonnolliset luvut itse, kuten 0, 1, 2, 3 jne.

Primitiivirekursiiviset funktiot kattavat initiaalifunktiot, eli nollafunktion, seuraajan ja projektiofunktiot ja ovat suljettuja funktioiden yhdistämisen ja primitiivirekursion suhteen. Seuraavassa merkitään x, jos tarkoitetaan n kappaleen luonnollisen luvun listaa x0,x1,x2,,xn1.

Initiaalifunktiot

Nollafunktio

0-paikkainen nollafunktio ζ, määritellään
ζ()=0
Tämä vastaa p.r. funktioissa itse lukua 0.

Seuraaja

1-paikkainen seuraajafunktio σ, ”määritellään” tai tulee myöhemmin tässä artikkelissa tarkoittamaan lisäämistä yhdellä, esimerkiksi:
σ(0)=1,σ(1)=2
Funktion täysi merkitys voidaan esitellä vasta funktioiden yhdistämisen määritelmän jälkeen.

Projektio

n-paikkainen m-projektiofunktio πmn poimii listasta x=x0,x1,,xn1 alkion kohdasta m, jolloin indeksointi (tässä artikkelissa) alkaa nollasta. Esimerkiksi:
π13(5,3,1)=3
Myöhemmin vakiofunktioiden esittämisen jälkeen projektiofunktiota voidaan yksinkertaistaa poistamalla oletus sen paikkaluvusta.

Primitiivirekursiiviset operaatiot

Yhdistäminen

Jos g on m-paikkainen funktio ja h=h0,h1hm1, n-paikkaisia funktioita, niin g:n ja h:n yhdiste
f=g(h(x))
on primitiivirekursiivinen. Merkitään
f=(γgh)
tai
f=(γgh0h1hm1)
Vakiofunktioiden esittämisen jälkeen voidaan löystää oletusta siitä, että kaikki h:oon kuuluvat funktiot olisivat täsmälleen n-paikkaisia.

Primitiivirekursio

Jos g on n-paikkainen funktio ja h on n+2, paikkainen funktio, niin f on n+1-paikkainen funktio, joka saadaan g:stä ja h:sta primitiivirekursiolla:
{f(0,x)=g(x)f(n+1,x)=h(n,f(n,x),x)
Merkitään
f=(ρgh)
Vakiofunktioiden esittämisen jälkeen voidaan löystää oletusta g:n ja h:n paikkaluvuista.

Numeraalit ja vakiofunktiot

(Church)-numeraalit

Kun yhdistäminen on esitelty, voidaan luonnollisten lukujen määritelmät kirjoittaa sen avulla seuraavasti:
0=ζ1=(γσζ)2=(γσ(γσζ))3=(γσ(γσ(γσζ)))
Jatkossa näitä monimutkaisempia muodollisia määritelmiä vältetään ja luonnolliset luvut kirjoitetaan numeroilla.

Vakiofunktiot

Monesti tulee tilanne, jossa tarvitaan vakiofunktiota, joka kuitenkin ottaa vastaan parametreja, mutta ei käytä niitä mihinkään. Viitaten yllä primitiivirekursion määritelmään, 1-paikkainen 0-funktio voitaisiin saada aikaan seuraavasti:
{f(0)=0f(n+1)=f(n)
Tämä olisi muodollisesti f=(ρζπ12). Yleisesti voidaan kaikki funktiot Kmn(x)=m, mikä tarkoittaa n-parametrista vakiofunktiota, jonka arvo on aina m, johtaa rekursiivisilla säännöillä:
{K00=ζKm+1n=(γσKmn)Kmn+1=(ρKmnπ1n+2)

Eksplisiittinen transformaatio

Koska projektiosääntö mahdollistaa myös funktion argumenttien paikan vaihtamisen, eli käytännössä, jos f(x,y) on p.r., niin myös g(x,y)=f(y,x) on p.r., muodollisesti g=(fπ12π02), niin voidaan päätellä, että ylimääräiset huomiotta jäävät parametrit missä tahansa kohdassa listaa eivät muuta niiden funktioiden perhettä, joita voidaan normaaleillakin p.r. funktioiden säännöillä luoda. Kun tehdään lisäoletus ”projisoinnista listan ulkopuolelle”, eli parametrit, joita ei erikseen ole määritelty, mutta joita kysytään, ovat nollia, voidaan luopua projektiofunktiossa listan pituuden esittelystä ja sallia funktioiden yhdistämiset ja primitiivirekursiot ilman tarkkaa oletusta parametrien määristä ja järjestyksestä. Jatkossa määritellään, että πm(x) on vektorin alkio kohdassa m tai 0, jos alkio on vektorin ulkopuolella. Esimerkin vuoksi saatetaan edelleen joissakin kohden käyttää tarkkaa muotoa.

Peruslaskutoimituksia

Summa

Kahden luvun summa n+x on primitiivirekursiivinen. Yksinkertaistetussa muodossa voidaan ensin havaita, että:
{n+0=n(n+1)+x=σ(n+x)
Muodollisesti plus=(ρ(π01(γσπ13))).

Rajoitettu edeltäjä

Rajoitettu edeltäjä, jossa minkä tahansa muun luvun paitsi luvun 0 edeltäjä on sitä yhtä pienempi luku, on p.r.
{σ1(0)=0σ1(n+1)=n
Muodollisesti σ1=(ρζπ02).

Rajoitettu vähennyslasku

Rajoitettu vähennyslasku xn=monus(n,x) on p.r.
{monus(0,x)=xmonus(n+1,x)=σ1monus(n,x)
Muodollisesti monus=(ρ(π01(γσ1π13)))=(ρ(π01(γ(ρζπ02)π13))). Rajoitettu vähennyslasku poikkeaa normaalista vähennyslaskusta siten, että negatiiviset luvut eivät ole käytössä, joten jos xy, niin vähennyslaskun xy tulos on aina 0, muuten tavallinen vähennyslaskun tulos. Myöhemmin havainnollistetaan, kuinka näin voidaan toteuttaa loogisia operaatioita.

Tulo

Tulo nx=prod(n,x) on p.r.
{prod(0,x)=0prod(n+1,x)=plus(prod(n,x),x)
Muodollisesti
prod=(ρK01(γ plus π13π23)). Tässä kohden on viimeistään huomattava, kuinka monimutkaista voi olla varmistaa, että primitiivirekursio-operaatiossa ρ on funktioilla oikea argumenttien lukumäärä. Tarvittiin esimerkiksi K01 pelkän ζ:n sijaan.

Logiikkaa

Predikaatit

Useissa loogisissa lausekkeissa kiinnostaa lukuarvojen sijasta vain, onko lause tosi vai epätosi . Voidaan sopia, että epätotta arvoa vastaa 0 ja totta arvoa vastaa 1. Jos on funktio Pf(x), joka voi saada vain arvot 0 ja 1, sanotaan, että Pf on predikaatin P karakteristinen funktio. Predikaatit, joiden karakteristinen funktio on p.r. ovat primitiivirekursiivisia predikaatteja. Seuraavassa taulukossa on lueteltu joitakin predikaattien operaatioita:

LausekeMerkitys
P, P=P on tosi
¬P, P=P on epätosi
PQJA: P ja Q ovat molemmat tosia
PQTAI: Ainakin jompikumpi P tai Q on tosi
PQP:stä seuraa Q, sama kuin ¬PQ.
PQP ja Q ovat samoja
PQERI: Joko P tai Q, ei molempia
Predikaattilogiikan operaattoreita: jos P ja Q ovat p.r. predikaatteja myös näillä johdetut predikaatit ovat p.r.

Kaikki taulukon operaattorit ovat primitiivirekursiivisia predikaatteja. Todistetaan tämä muutamille tärkeimmille, loppujen todistukset voi tehdä harjoitustehtävänä. P= on p.r., koska Pf=1, P= on p.r., koska Pf=0, R=¬P on p.r. koska Rf=1Pf, R=PQ on p.r. koska Rf=PfQf, PQ=¬(¬P¬Q) ja PQ=¬PQ kuten taulukossakin mainittiin. Kaksi alinta jäävät lukijan itse pääteltäviksi. Myös muita tapoja todistaa näitä on olemassa.
Funktio sgn, joka määritellään niin, että sgn(0)=0 ja 1 muuten ja joka siis muuntaa minkä tahansa funktion predikaatiksi, on myös p.r.
{sgn(0)=0sgn(n+1)=1
Vaihtoehtoisesti sgn(x)=1(1x) tai muodollisesti sgn=(ρζK12).

Rajoitettu universaali kvantifikaatio

Jos P(n,x) on primitiivirekursiivinen predikaatti, niin predikaatti
Q(m,x)=[n<m]P(n,x)
eli ”kaikilla n<m, pätee P(n,x)”, on myös primitiivirekursiivinen.
{Q(0,x)=Q(m+1,x)=Q(m,x)P(m+1,x)
Rajoittamaton universaali kvantifikaatio Q(x)=nP(n,x) sen sijaan ei ole primitiivirekursiivinen.

Rajoitettu eksistentiaalinen kvantifikaatio

Jos P(n,x) on primitiivirekursiivinen predikaatti, niin predikaatti
Q(m,x)=[n<m]P(n,x)
eli ”on olemassa n<m, siten että pätee P(n,x)”, on myös primitiivirekursiivinen.
Q(m,x)=¬([n<m]¬P(n,x))
Taaskaan rajoittamaton eksistentiaalinen kvantifikaatio Q(x)=nP(n,x) ei ole p.r.

Yhtäsuuruus ja erisuuruus

Lukujen yhtäsuuruuden tai suuruusjärjestyksen määrittäminen on p.r. Esimerkiksi sen testaaminen, onko luku 0, voidaan määritellä
{0?(0)=0?(n+1)=
Lisäksi (xy)=(xy=0) ja (x=y)=((xy)(yx)).

Lisää lukujen laskutoimituksia

Rajoitettu summa ja tulo

Jos ϕ(n,x) on primitiivirekursiivinen funktio, niin myös f(m,x)=n=0m1ϕ(n,x) on primitiivirekursiivinen.
{f(0,x)=0f(m+1,x)=f(m,x)+ϕ(m+1,x)
Hyvin samantapaisella kaavalla voi todistaa, että myös rajoitettu tulo f(m,x)=n=0m1ϕ(n,x) on p.r.

Potenssiin korottaminen

Potenssiin korottaminen mn=mmmn on primitiivirekursiivinen:
mn=k=0n1m

Rajoitettu minimalisaatio

Seuraava operaatio on hyvin tärkeä. Olemme tähän mennessä jättäneet esimerkiksi osamäärän, jakojäännöksen, juurenoton ja logaritmin käsittelemättä, koska ne ovat luonteeltaan sellaisia, että niitä varten tarvitsee ratkaista epäyhtälö tai yhtälö. Toisaalta niissä tiedetään raja, jonka puitteissa voidaan tehdä etsintä. Esimerkiksi m/n ei koskaan ole suurempi kuin m, jos m0 ja n1.

Jos ϕ(n,x) on primitiivirekursiivinen funktio, niin myös f(m,x)=μ[n<m]ϕ(n,x)=0, eli pienin n<m siten, että ϕ(n,x)=0, on primitiivirekursiivinen.
{f(0,x)=0f(m+1,x)={m+1jos (ϕ(m,x)0)(f(m,x)=m)f(m,x)muuten

Osamäärä

Osamäärä on p.r.
x/y=(μ[n<(x+1)] ¬(ny>x))1
Tässä ¬-merkkiä käytettiin, koska ylempänä määrittelimme rajoitetun minimalisaation tarkoittavan pienimmän nollakohdan hakua, mutta nyt halusimme sitävastoin, että tietty predikaatti olisi tosi (jolloin sen negaatio on0).

Jakojäännös

Jakojäännös on p.r.
x%y=x(x/y)y
On muistettava, että osamäärä on tässä kokonaisluku, joka on alaspäin pyöristetty tulos reaalisesta osamäärästä.

Juurenotto

Juurenotto on p.r.
xy=(μ[n<(x+1)] ¬(ny>x))1

Logaritmi

Logaritmi on p.r.
logy(x)=(μ[n<(x+1)] ¬(yn>x))1

Alkuluvut

Predikaatti, joka tarkastaa, onko annettu luku alkuluku, on p.r.
prime?(x)=[n<x] (n<2)(x%n0)
On mahdollista todistaa, että funktio, joka antaa jotakin lukua seuraavan alkuluvun ja funktio, joka generoi n:nnen alkuluvun ovat molemmat p.r. Tämä jätetään harjoitustehtäväksi.

Tietorakenteet, algoritmit ja Gödel-numerointi

Tähän mennessä olemme käsitelleet vain funktioita, jotka palauttavat yksittäisen luonnollisen luvun. Kuitenkin nykyaikaisessa tietotekniikassa esiintyy tarvetta palauttaa ja käsitellä paljon muunlaistakin tietoa, kuten merkkijonoja, lukupareja, lukulistoja ja objekteja. Lisäksi tarvetta on muidenkin numeroituvien lukujoukkojen kuten kokonaislukujen, rationaalilukujen tai jopa kompleksilukujen, joiden reaali- ja imaginaariosat ovat molemmat rationaalikertoimisia, käsittelyyn ja useimmat tällaisetkin operaatiot ovat p.r. Seuraavassa käsittelemme tekniikan, jolla yksittäiseen luonnolliseen lukuun voidaan koodata näennäisesti laajempi tietorakenne. Olennaista on, että tietorakenne on numeroituva. Siksi esimerkiksi koko reaalilukujen tai kompleksilukujen joukkoa tai mitään muuta ylinumeroituvaa joukkoa ei voi käsitellä pelkillä primitiivirekursiivisilla funktioilla.

Kolmioluvut ja Cantorin parifunktio

Kolmioluvut ovat lukuja, joita saadaan laskemalla peräjälkeen luonnollisia lukuja, esimerkiksi T(0)=0,T(1)=0+1=1,T(2)=0+1+2,. Koska kyseessä on rajoitettu aritmeettinen summa, on se edellä käsitellyn rajoitetun summan perusteella tietenkin p.r. Kuitenkin tässä yhteydessä on hyvä muistuttaa mieleen aritmeettisen summan kaavasta johdettu kolmiolukujen kaava:
T(n)=n(n+1)2
Jos nyt tarkastellaan lukupareja, jotka on ensisijaisesti järjestetty lukujen summan mukaan, toissijaisesti jälkimmäisen luvun mukaan, saadaan jono (0,0),(1,0),(0,1),(2,0),(1,1),(0,2),(3,0),. Havaitaan, että kaikkien parien, joiden jälkimmäinen luku on 0, positiot (nollasta lukien) ovat kolmiolukuja! Tämä johtaa seuraavaan kaavaan, jolla kaksi luonnollista lukua pakataan yhteen lukuun:
cons(x,y)=T(x+y)+y
Funktiota cons sanotaan keksijänsä/julkaisijansa mukaan Cantorin parifunktioksi ja se on p.r. Mitkä ovat Cantorin parifunktion käänteisfunktiot, jotka purkavat lukuparin koodauksen?
Ratkaistaan toisen asteen yhtälö:
n(n+1)2=mn2+n2m=0n=1±1+8m2
Koska nyt käsitellään luonnollisia lukuja, voidaan ylläoleva lauseke pyöristää alaspäin ja käyttää neliöjuuren etumerkissä pelkkää +-merkkiä:
T1(m)=1+8m12
Nyt tiedämme, että T1 on p.r. ja että koodatusta lukuparista p saadaan eroteltua ainakin lukuparin summa laskemalla S=T1(p). Voidaan päätellä
x+y=Sy=pSx=2Sp
Tämän perusteella voidaan määrittää p.r. funktiot car ja cdr, jotka purkavat lukuparin ensimmäisen tai toisen jäsenen seuraavasti:
car(cons(x,y))=x=2Spcdr(cons(x,y))=y=pS

Linkitetyt listat

Parifunktio mahdollistaa mielivaltaisen pituisten lukujonojen eli lukulistojen laatimisen. Sovitaan, että L=0 vastaa tyhjää listaa ja sitä suuremmilla luvuilla L1 olkoon pari, jossa vasemmalla puolella on listan nollas alkio ja oikealla puolella listan loppuosa. Lista päättyy, jos listan loppuosa on tyhjä lista eli 0.

Listan L n:nnen alkion lukeminen L[n] on p.r.
{L[0]=car(L)L[n+1]=cdr(L)[n]
samoin kuin listan pituuden len(L) määrittäminen:
{len(0)=0len(L)=1+len(cdr(L))muuten
tai listan n:nnen alkion poisto rm(L,n):
{rm(L,0)=cdr(L)rm(L,n+1)=cons(car(L),rm(L,n))
Näiden lisäksi lähes kaikki muutkin ajateltavissa olevat tavanomaiset listaoperaatiot, kuten tietyn listan arvon etsintä, alkioiden lisääminen listojen väliin, listojen yhteenliittäminen yms. ovat p.r. Todistukset ovat samantapaisia kuin kolme aiempaa esimerkkiä.

Binaaripuut

Binaaripuu voidaan koodata siten, että sovitaan parillisten lukujen tarkoittavan yhden luvun binaaripuuta b/2 ja parittomien lukujen tarkoittavan binaaripuuta, jonka vasemmalla puolella on car((b1)/2) ja oikealla puolella cdr((b1)/2). Binaaripuun syvyys on p.r. funktio tai alkion esiintyminen binaaripuussa tai erikseen sen vasemmalla tai oikealla puolella p.r. relaatio. Alkioiden sijainti tai syvyys puussa on myös p.r.

Merkkijonot ja unionit

Halutaan mahdollistaa merkkijonot, mutta sen lisäksi myös niiden seassa mielivaltaiset luvut. Tällöin voidaan laatia lista, kuten ylempänä, mutta sopia, että listassa oleva luku x tarkoittaa lukua x/2, jos x on parillinen tai Unicode-merkkiä (x1)/2 muuten.

Objektit

Halutaan mahdollistaa taulukot, joissa on avain-arvopareja niin, että kutakin merkkijonoarvoa vastaa luku tai muu objekti, esimerkiksi:

{
  "auto": 6,
  "polkupyörä: 12,
  "moottoripyörä": (18,17)
}

Tällöin voidaan keksiä ensin yksittäisten rivien vasempia puolia vastaava koodaustapa ja sen jälkeen luoda lista pareista cons(VP,OP).

Johtopäätös

Olemme havainneet, että lähes kaikki ajateltavissa olevat lukujen ja muiden rakenteiden operaatiot, joita esiintyy, ovat primitiivirekursiivisia. Artikkelisarjan jälkimmäisessä osassa käydään läpi funktioita, jotka ovat kyllä laskettavia, mutta eivät ole primitiivirekursiivisia. Lisäksi osoitamme, että tietyt funktiot ja relaatiot eivät ole laskettavia. Tätä yllättävää tulosta ja sen eri variaatioita kutsutaan Gödelin lukuteorian epätäydellisyyslauseeksi.

Artikkelisarjan seuraava osa on täällä.