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 $\lambda$-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 $\vec{x}$, jos tarkoitetaan $n$ kappaleen luonnollisen luvun listaa $x_0,x_1,x_2, … ,x_{n-1}$.

Initiaalifunktiot

Nollafunktio

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

Seuraaja

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

Projektio

$n$-paikkainen $m$-projektiofunktio $\pi_m^n$ poimii listasta $\vec{x}=x_0,x_1,…,x_{n-1}$ alkion kohdasta $m$, jolloin indeksointi (tässä artikkelissa) alkaa nollasta. Esimerkiksi:
$$\pi_1^3(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 $\vec{h}=h_0,h_1…h_{m-1}$, $n$-paikkaisia funktioita, niin $g$:n ja $\vec{h}$:n yhdiste
$$f=g(\vec{h}(\vec{x}))$$
on primitiivirekursiivinen. Merkitään
$$f=(\gamma g\vec{h})$$
tai
$$f=(\gamma g h_0 h_1 … h_{m-1})$$
Vakiofunktioiden esittämisen jälkeen voidaan löystää oletusta siitä, että kaikki $\vec{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:
$$\left\{
\begin{array}{ccc}
f(0,\vec{x}) & = & g(\vec{x}) \\
f(n+1,\vec{x}) & = & h\left(n,f(n,\vec{x}),\vec{x}\right)
\end{array}
\right.$$
Merkitään
$$f=(\rho g h)$$
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:
\begin{array}{ccc}
0 & = & \zeta \\
1 & = & (\gamma \sigma \zeta) \\
2 & = & \left(\gamma \sigma (\gamma \sigma \zeta)\right) \\
3 & = & \left(\gamma \sigma \left(\gamma \sigma (\gamma \sigma \zeta)\right)\right) \\

\end{array}
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:
$$\left\{
\begin{array}{ccc}
f(0) & = & 0 \\
f(n+1) & = & f(n)
\end{array}
\right.$$
Tämä olisi muodollisesti $f=(\rho\zeta\pi_1^2)$. Yleisesti voidaan kaikki funktiot $K_m^n(\vec{x})=m$, mikä tarkoittaa $n$-parametrista vakiofunktiota, jonka arvo on aina $m$, johtaa rekursiivisilla säännöillä:
$$\left\{
\begin{array}{ccc}
K_0^0 & = & \zeta \\
K_{m+1}^n & = & (\gamma\sigma K_m^n) \\
K_m^{n+1} & = & (\rho K_m^n \pi_1^{n+2})
\end{array}
\right.$$

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\pi_1^2 \pi_0^2)$, 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ä $\pi_m(\vec{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ä:
$$\left\{
\begin{array}{ccc}
n+0 & = & n \\
(n+1)+x & = & \sigma(n+x)
\end{array}
\right.$$
Muodollisesti $\mathrm{plus}=\left(\rho\left(\pi_0^1(\gamma\sigma\pi_1^3)\right)\right)$.

Rajoitettu edeltäjä

Rajoitettu edeltäjä, jossa minkä tahansa muun luvun paitsi luvun $0$ edeltäjä on sitä yhtä pienempi luku, on p.r.
$$\left\{
\begin{array}{ccc}
\sigma^{-1}(0) & = & 0 \\
\sigma^{-1}(n+1) & = & n
\end{array}
\right.$$
Muodollisesti $\sigma^{-1}=(\rho\zeta\pi_0^2)$.

Rajoitettu vähennyslasku

Rajoitettu vähennyslasku $x-’n=\mathrm{monus}(n,x)$ on p.r.
$$\left\{
\begin{array}{ccc}
\mathrm{monus}(0,x) & = & x \\
\mathrm{monus}(n+1,x) & = & \sigma^{-1}\mathrm{monus}(n,x)
\end{array}
\right.$$
Muodollisesti $\mathrm{monus}=\left(\rho\left(\pi_0^1(\gamma\sigma^{-1}\pi_1^3)\right)\right)=\left(\rho\left(\pi_0^1\left(\gamma(\rho\zeta\pi_0^2)\pi_1^3\right)\right)\right)$. Rajoitettu vähennyslasku poikkeaa normaalista vähennyslaskusta siten, että negatiiviset luvut eivät ole käytössä, joten jos $x\le y$, niin vähennyslaskun $x-’y$ tulos on aina $0$, muuten tavallinen vähennyslaskun tulos. Myöhemmin havainnollistetaan, kuinka näin voidaan toteuttaa loogisia operaatioita.

Tulo

Tulo $n\cdot x=\mathrm{prod}(n,x)$ on p.r.
$$\left\{
\begin{array}{ccc}
\mathrm{prod}(0,x) & = & 0 \\
\mathrm{prod}(n+1,x) & = & \mathrm{plus}(\mathrm{prod}(n,x),x)
\end{array}
\right.$$
Muodollisesti
$\mathrm{prod}=(\rho K_0^1(\gamma\ \mathrm{plus}\ \pi_1^3 \pi_2^3))$. Tässä kohden on viimeistään huomattava, kuinka monimutkaista voi olla varmistaa, että primitiivirekursio-operaatiossa $\rho$ on funktioilla oikea argumenttien lukumäärä. Tarvittiin esimerkiksi $K_0^1$ pelkän $\zeta$:n sijaan.

Logiikkaa

Predikaatit

Useissa loogisissa lausekkeissa kiinnostaa lukuarvojen sijasta vain, onko lause tosi $\top$ vai epätosi $\bot$. Voidaan sopia, että epätotta arvoa vastaa $0$ ja totta arvoa vastaa $1$. Jos on funktio $P_f(\vec{x})$, joka voi saada vain arvot $0$ ja $1$, sanotaan, että $P_f$ 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=\top$$P$ on tosi
$\lnot P,\ P=\bot$$P$ on epätosi
$P\land Q$JA: $P$ ja $Q$ ovat molemmat tosia
$P\lor Q$TAI: Ainakin jompikumpi $P$ tai $Q$ on tosi
$P\to Q$$P$:stä seuraa $Q$, sama kuin $\lnot P\lor Q$.
$P\leftrightarrow Q$$P$ ja $Q$ ovat samoja
$P\not\leftrightarrow Q$ERI: 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=\top$ on p.r., koska $P_f=1$, $P=\bot$ on p.r., koska $P_f=0$, $R=\lnot P$ on p.r. koska $R_f=1-’P_f$, $R=P\land Q$ on p.r. koska $R_f=P_f\cdot Q_f$, $P\lor Q=\lnot(\lnot P \land \lnot Q)$ ja $P\to Q=\lnot P\lor Q$ kuten taulukossakin mainittiin. Kaksi alinta jäävät lukijan itse pääteltäviksi. Myös muita tapoja todistaa näitä on olemassa.
Funktio $\mathrm{sgn}$, joka määritellään niin, että $\mathrm{sgn}(0)=0$ ja $1$ muuten ja joka siis muuntaa minkä tahansa funktion predikaatiksi, on myös p.r.
$$
\left\{
\begin{array}{ccc}
\mathrm{sgn}(0) & = & 0 \\
\mathrm{sgn}(n+1) & = & 1
\end{array}
\right.
$$
Vaihtoehtoisesti $\mathrm{sgn}(x)=1-’(1-’x)$ tai muodollisesti $\mathrm{sgn}=(\rho\zeta K_1^2)$.

Rajoitettu universaali kvantifikaatio

Jos $P(n,\vec{x})$ on primitiivirekursiivinen predikaatti, niin predikaatti
$$Q(m,\vec{x})=\forall[n<m] P(n,\vec{x})$$
eli ”kaikilla $n<m$, pätee $P(n,\vec{x})$”, on myös primitiivirekursiivinen.
$$
\left\{
\begin{array}{ccc}
Q(0,\vec{x}) & = & \top \\
Q(m+1,\vec{x}) & = & Q(m,\vec{x}) \land P(m+1,\vec{x}
)\end{array}
\right.
$$
Rajoittamaton universaali kvantifikaatio $Q(\vec{x})=\forall n P(n,\vec{x})$ sen sijaan ei ole primitiivirekursiivinen.

Rajoitettu eksistentiaalinen kvantifikaatio

Jos $P(n,\vec{x})$ on primitiivirekursiivinen predikaatti, niin predikaatti
$$Q(m,\vec{x})=\exists[n<m] P(n,\vec{x})$$
eli ”on olemassa $n<m$, siten että pätee $P(n,\vec{x})$”, on myös primitiivirekursiivinen.
$$
Q(m,\vec{x})=\lnot\left(\forall[n<m] \lnot P(n,\vec{x})\right)
$$
Taaskaan rajoittamaton eksistentiaalinen kvantifikaatio $Q(\vec{x})=\exists n P(n,\vec{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ä
$$
\left\{
\begin{array}{ccc}
\textrm{0?}(0) & = & \top \\
\textrm{0?}(n+1) & = & \bot
\end{array}
\right.
$$
Lisäksi $(x\leq y)=(x-’y=0)$ ja $(x=y)=((x\leq y)\land(y\leq x))$.

Lisää lukujen laskutoimituksia

Rajoitettu summa ja tulo

Jos $\phi(n,\vec{x})$ on primitiivirekursiivinen funktio, niin myös $f(m,\vec{x})=\sum_{n=0}^{m-1} \phi(n,\vec{x})$ on primitiivirekursiivinen.
$$
\left\{
\begin{array}{ccc}
f(0,\vec{x}) & = & 0 \\
f(m+1,\vec{x}) & = & f(m,\vec{x})+\phi(m+1,\vec{x}
)\end{array}
\right.
$$
Hyvin samantapaisella kaavalla voi todistaa, että myös rajoitettu tulo $f(m,\vec{x})=\prod_{n=0}^{m-1} \phi(n,\vec{x})$ on p.r.

Potenssiin korottaminen

Potenssiin korottaminen $m^n=\underbrace{m\cdot m\cdots m}_n$ on primitiivirekursiivinen:
$$m^n=\prod_{k=0}^{n-1} m$$

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 $m\ge 0$ ja $n\ge 1$.

Jos $\phi(n,\vec{x})$ on primitiivirekursiivinen funktio, niin myös $f(m,\vec{x})=\mu[n<m]\phi(n,\vec{x})=0$, eli pienin $n<m$ siten, että $\phi(n,\vec{x})=0$, on primitiivirekursiivinen.
$$
\left\{
\begin{array}{ccc}
f(0,\vec{x}) & = & 0 \\
f(m+1,\vec{x}) & = &
\left\{
\begin{array}{cc}
m+1 & \textrm{jos}\ \left(\phi(m,\vec{x})\neq 0\right) \land \left(f(m,\vec{x})=m\right) \\
f(m,\vec{x}) & \textrm{muuten}
\end{array}
\right.
\end{array}
\right.
$$

Osamäärä

Osamäärä on p.r.
$$x/y=\left(\mu[n<(x+1)]\ \lnot(ny>x)\right)-’1$$
Tässä $\lnot$-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 on$0$).

Jakojäännös

Jakojäännös on p.r.
$$x\%y=x-(x/y)\cdot 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.
$$\sqrt[y]{x}=\left(\mu[n<(x+1)]\ \lnot(n^y>x)\right)-’1$$

Logaritmi

Logaritmi on p.r.
$$\log_y(x)=\left(\mu[n<(x+1)]\ \lnot(y^n>x)\right)-’1$$

Alkuluvut

Predikaatti, joka tarkastaa, onko annettu luku alkuluku, on p.r.
$$\mathrm{prime?}(x)=\forall[n<x]\ (n<2)\lor (x\%n \neq 0)$$
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,\cdots$. 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)=\frac{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),\cdots$. 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:
$$
\mathrm{cons}(x,y)=T(x+y)+y
$$
Funktiota $\mathrm{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ö:
$$
\begin{eqnarray}
\frac{n(n+1)}{2} & = & m \\
n^2+n-2m & = & 0 \\
n & = & \frac{-1\pm\sqrt{1+8m}}{2}
\end{eqnarray}
$$
Koska nyt käsitellään luonnollisia lukuja, voidaan ylläoleva lauseke pyöristää alaspäin ja käyttää neliöjuuren etumerkissä pelkkää $+$-merkkiä:
$$
T^{-1}(m)=\left\lfloor\frac{\sqrt{1+8m}-’1}{2}\right\rfloor
$$
Nyt tiedämme, että $T^{-1}$ on p.r. ja että koodatusta lukuparista $p$ saadaan eroteltua ainakin lukuparin summa laskemalla $S=T^{-1}(p)$. Voidaan päätellä
$$
\begin{eqnarray}
x+y & = & S \\
y & = & p-S \\
x & = & 2S-p
\end{eqnarray}
$$
Tämän perusteella voidaan määrittää p.r. funktiot $\mathrm{car}$ ja $\mathrm{cdr}$, jotka purkavat lukuparin ensimmäisen tai toisen jäsenen seuraavasti:
$$
\begin{eqnarray}
\mathrm{car}(\mathrm{cons}(x,y)) & = & x=2S-’p \\
\mathrm{cdr}(\mathrm{cons}(x,y)) & = & y=p-’S
\end{eqnarray}
$$

Linkitetyt listat

Parifunktio mahdollistaa mielivaltaisen pituisten lukujonojen eli lukulistojen laatimisen. Sovitaan, että $L=0$ vastaa tyhjää listaa ja sitä suuremmilla luvuilla $L-’1$ 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.
$$
\left\{
\begin{array}{ccc}
L[0] & = & \mathrm{car}(L) \\
L[n+1] & = & \mathrm{cdr}(L)[n]
\end{array}
\right.
$$
samoin kuin listan pituuden $\mathrm{len}(L)$ määrittäminen:
$$
\left\{
\begin{array}{ccc}
\mathrm{len}(0) & = & 0 \\
\mathrm{len}(L) & = & 1+\mathrm{len}(\mathrm{cdr}(L))\quad \textrm{muuten}
\end{array}
\right.
$$
tai listan $n$:nnen alkion poisto $\mathrm{rm}(L,n)$:
$$
\left\{
\begin{array}{ccc}
\mathrm{rm}(L,0) & = & \mathrm{cdr}(L) \\
\mathrm{rm}(L,n+1) & = & \mathrm{cons}(\mathrm{car}(L),\mathrm{rm}(L,n))
\end{array}
\right.
$$
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 $\mathrm{car}((b-’1)/2)$ ja oikealla puolella $\mathrm{cdr}((b-’1)/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ä $(x-’1)/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 $\mathrm{cons}(\mathrm{VP},\mathrm{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ä.