Lyhyt MathCheck-ohje (uuteen välilehteen)
Tämä tehtävä on jatkoa tehtävälle Pysähtymistesterin mahdottomuus. Tässä tehtävässä käytetään siellä esiteltyjä käsitteitä ja merkintöjä, joten se pitää tehdä ensin.
Aliohjelman suorittamiseen kuluva aika riippuu paitsi aliohjelmasta ja sen syötteestä, myös tietokoneesta jossa aliohjelma ajetaan, kääntäjästä jolla aliohjelma käännettiin tai tulkista jolla sitä tulkataan, siitä mitä muuta sama tietokone tekee samanaikaisesti ja niin edelleen. Toisaalta isoilla syötteillä kuluva aika ei useinkaan riipu ensisijaisesti näistä, vaan aliohjelmassa käytettyjen algoritmien valinnasta. Tarkka ajankäytön analyysi on siis sekä hyvin vaikeaa että melko tarpeetonta. Siksi tietojenkäsittelytieteessä tutkitaan harvoin tarkkaa ajankulutusta. Sen sijaan ajankulutusta arvioidaan niin sanotuilla O-, Θ- ja Ω-merkinnöillä.
O- yms. merkinnät ovat valitettavasti jossain määrin vaikeatajuisia, joten emme käytä niitä tässä tehtävässä. Sen sijaan kuvittelemme aliohjelman suorituksen koostuvan askelista ja laskemme askelten määriä. O- yms. merkintöjen mielessä oikeiden tulosten saamiseksi riittää, että yhden askeleen suorittamiseen kuluvalla ajalla on syötteestä riippumaton positiivinen alaraja ja syötteestä riippumaton positiivinen yläraja. Askeleen suoritusaika saa siis vaihdella, mutta ei miten paljon tahansa. Esimerkiksi taulukon nollaaminen vaatii monta askelta, koska sen kuluttama aika kasvaa rajatta taulukon koon kasvaessa.
Mikä tarkkaan ottaen muodostaa askeleen ei siis ole olennaista. Päättelyiden ymmärtämisen helpottamiseksi sovimme kuitenkin, että kukin seuraavista vie yhden askeleen:
Siirtyminen testituloksen perusteella toiseen paikkaan aliohjelmaa ei vie yhtään askelta (riittää, että testin suorittaminen vie). Paluu silmukan alkuun ei vie yhtään askelta (riittää, että silmukkaehdon testaaminen vie). Jos aliohjelman suoritus ei pysähdy, niin se suorittaa loputtomasti askelia, ja päinvastoin. ”Äärettömän monta askelta” tarkoittaa samaa kuin ”loputtomasti askelia”.
esimerkki1(n ∈ ℕ) ∈ ℕ
j := 0
for i := 1 to n do
j := j + i
return j
Seuraavalla aliohjelmalla ei ole syötettä. Aliohjelmasta näkee heti, että sen suorittamien askelten määrä on …ääretön. Suoritus juuttuu ikuiseen silmukkaan eikä pääse koskaan return-lauseeseen. Niinpä aliohjelma suorittaa äärettömän monta askelta.
esimerkki2 ∈ ℕ
i := 0
while T do
i := i + 1
return i
Lopulliset tulokset ilmaisemme muodossa, joka ei riipu askeliin jakamisen
yksityiskohdista eikä siitä, kuinka paljon aikaa yhden askeleen suorittaminen
vie.
Käytämme muun muassa ilmausta n:n suhteen lineaarinen.
Voit ajatella, että se tarkoittaa ”suurin piirtein yhtäsuuri kuin n”.
Esimerkiksi sekä 4n + 1000000 että n − 1000000 ovat n:n
suhteen lineaarisia.
Halutessasi voit lukea tarkan määritelmän tästäAskelmäärä on enintään n:n suhteen lineaarinen, jos ja
vain jos sille on olemassa yläraja muotoa an + b, missä a
on positiivinen reaaliluku ja b on reaaliluku.
Ilmaus O(n) tarkoittaa samaa.
Askelmäärä on vähintään n:n suhteen lineaarinen, jos ja vain jos sille
on olemassa alaraja muotoa an + b, missä a on positiivinen
reaaliluku ja b on reaaliluku.
Ilmaus Ω(n) tarkoittaa samaa.
Askelmäärä on n:n suhteen lineaarinen, jos ja vain jos se on sekä
vähintään että enintään n:n suhteen lineaarinen.
Ilmaus Θ(n) tarkoittaa samaa..
Käytämme seuraavaa aliohjelmaa jatkossa paljon esimerkkinä. Se löytyy myös oikealta palautelaatikon yläpuolelta. Nimi väsi tulee sanasta ”vähennyssilmukka”.
väsi(n ∈ ℕ, m ∈ ℕ) ∈ ℕ
while n ≥ m do
n := n − m
return n
Kuinka monta askelta väsi(12, 5):n suoritus vie?
vastausKahdeksan:
1. Todetaan, että 12 ≥ 5 ja mennään silmukan vartaloon.
2. Lasketaan 12 − 5 ja saadaan 7.
3. Sijoitetaan 7 n:ään.
4. Todetaan, että 7 ≥ 5 ja mennään silmukan vartaloon.
5. Lasketaan 7 − 5 ja saadaan 2.
6. Sijoitetaan 2 n:ään.
7. Todetaan, että 2 < 5 ja mennään pois silmukasta.
8. Palautetaan 2.
Kuinka monta askelta väsi(12, 0):n suoritus vie? vastausÄärettömän monta. Koska m = 0, ei n:n arvo muutu sijoituksessa n := n − m. Siksi aliohjelman silmukkaa suoritetaan ikuisesti.
Kuinka monta askelta väsi(1002, 5):n suoritus vie? vihjeJos n ≥ 5, niin kolme seuraavaa askelta pienentää n:ää viidellä. Niinpä 600 askelta pienentää n:ää tuhannella. Sen jälkeen n < 5, jolloin suoritetaan enää kaksi askelta: silmukasta poistuminen ja return n. vastaus602
Kuinka monta askelta väsi(1000002, 5):n suoritus vie? vastaus600002
Collatz(n ∈ ℕ) ∈ ℕ
while n > 1 do
if n on parillinen then
n :=
n 2
else
n := 3n + 1
return n
Jos kaikki aliohjelmat pysähtyisivät aina lopulta kaikilla syötteillä, niin askelten määrä saataisiin aina selville suorittamalla aliohjelma ja laskemalla askeleet. Mutta, kuten totesimme edellä, esimerkiksi väsi(12, 0) ei pysähdy. Jos emme tunne aliohjelman koodia, niin vaikka aliohjelman suoritus olisi jo kestänyt hyvin kauan, emme voi julistaa että se on ikuisessa silmukassa, sillä voihan olla että se lopettaisi jos malttaisimme odottaa vielä jonkin aikaa. Jos olisi olemassa yleispätevä keino saada vastaus kysymykseen ”kuinka monta askelta annetun aliohjelman suoritus vie annetulla syötteellä”, niin sitä voitaisiin käyttää pysähtymistesterinä: jos keino antaa vastaukseksi luonnollisen luvun, niin tutkittu aliohjelma pysähtyy, ja jos keino vastaa ”ääretön”, niin tutkittu aliohjelma ei pysähdy.
Ymmärtääksemme paremmin mistä on kyse, tutkimme kohta kysymystä, johon voidaan aina saada vastaus äärellisessä ajassa: pysähtyykö annettu aliohjelma annetulla syötteellä suoritettuaan enintään annetun määrän askelia. Tämä kysymys on kyllä/ei-kysymys. Siihen voidaan saada vastaus suorittamalla aliohjelmaa kunnes se pysähtyy tai annettu määrä askelia tulee täyteen.
Jos tiedetään, että aliohjelman suorittamien askelten määrä
on k, missä k on luonnollinen luku tai ääretön, niin tällä tavallaif k = ääretön
then
return F
else if k ≤ n then
return T
else
return F
voidaan selvittää, pysähtyykö aliohjelma enintään n
askeleella.
Teorian kehittämisen helpottamiseksi tarkastelemme vain aliohjelmia, joiden syöte koostuu yhdestä osasta ja se osa on merkkijono. Tämä ei vähennä tulosten yleispätevyyttä, koska muunlaiselle syötteelle voidaan sopia jokin esitystapa merkkijonona, ja aliohjelman eteen voidaan lisätä vaihe, joka tulkitsee tämän merkkijonon alkuperäisen aliohjelman haluamaksi syötteeksi. Merkkijonovakiot esitetään ”kaksinkertaisissa” ja merkkivakiot kuten ’x’ yksinkertaisissa lainausmerkeissä.
väsi_mj(σ ∈ Σ*) ∈ ℕ
lisää σ:n loppuun '.' // varmistaa, ettei suoritus kaadu
n := 0; m := 0; i := 1
while '0' ≤ σ[i] ≤ '9' do
n := 10n + σ[i] − '0'; i := i + 1
while σ[i] = ' ' do
i := i + 1
while '0' ≤ σ[i] ≤ '9' do
m := 10m + σ[i] − '0'; i := i + 1
while n ≥ m do
n := n − m
return n
Mitä tämä esimerkki olettaa merkkijonojen indeksoinnista?
vastausSe olettaa, että ne indeksoidaan
ykkösestä alkaen.
Tämä näkyy siitä, että väsi_mj selaa σ:aa kohdasta 1 alkaen.
Se mahdollisuus, että indeksointi alkaisi nollasta mutta σ[0] jätetään
käyttämättä, on suljettu pois tällä perusteellaväsi_mj(ε) tutkii σ[1]:n kun σ = ”.”.
Se on laillista vain jos indeksointi alkaa ykkösestä.
Jos indeksointi alkaa ykkösestä, niin väsi_mj(σ) indeksoi σ:aa vain
laillisesti seuraavasta syystä.
Se indeksoi ensimmäisestä kohdasta alkaen korkeintaan niin pitkälle kunnes
löytyy ’.’.
Se löytyy varmasti, koska σ:n lopussa on ’.’..
Oletamme, että väsi_mj:n ensimmäinen while-silmukka vie 8 askelta kierrosta kohti, samoin kolmas, toinen vie 3 askelta kierrosta kohti, samoin neljäs, ja muuhun menee 12 askelta. (Luvuissa oletetaan, että indeksointi σ[i] vie askeleen silmukan ehdossa mutta ei silmukan vartalossa, koska siellä voidaan käyttää ehdossa jo saatua tulosta.) Kuinka monta askelta seuraavien kutsujen suoritus vie?
Tässä esimerkissä syöte on merkkijono, jonka pituus on k + 3. Jos syötteen pituutta merkitään s:llä, niin askelten määrä on 3 ⋅ 10s−3 + 8s + 7. Tämän vertaaminen tehtävän ”Kuinka monta askelta väsi(n, 1):n suoritus vie?” vastaukseen3n + 2 havainnollistaa sitä, että on aivan eri asia mitata suoritusaikaa syötteen pituuden funktiona kuin syötteessä esiintyvän luvun lukuarvon funktiona.
Tarvitsemme toistuvasti ilmausta ”aliohjelma, jonka syöte on yksi merkkijono”, joten lyhennämme sen ajsoym.
Suoritukseen perustuva askelrajoitetun pysähtymisen testeri on aliohjelma spapt(π, σ, n), jolla on seuraavat ominaisuudet. Ensin se tutkii, onko π ajsoym. Jollei ole, niin spapt(π, σ, n) = F eli spapt(π, σ, n) palauttaa F. Jos on, niin se suorittaa π:tä σ:lla kunnes se pysähtyy tai n suoritusaskelta tulee täyteen. Jos suoritus pysähtyi, niin spapt(π, σ, n) = T. Jos se ei pysähtynyt, niin spapt(π, σ, n) = F.
Jos π(σ) ei pysähdy ja n = 73, niin mitä on spapt(π, σ, n)? vastausSe on F. Koska π(σ):n suoritus jatkuu loputtomasti, se ei pysähdy 73 askeleeseen mennessä.
Suoritukseen perustuva askelrajoitetun pysähtymisen testeri voidaan toteuttaa. Ohjelmointikielten kääntäjiä osataan tehdä, eikä spapt(π, σ, n) poikkea niistä paljonkaan. Sen tutkiminen, onko π ajsoym, on tavallista kääntäjätekniikkaa ja saadaan onnistumaan jokaisella π. Tutkiminen ei siis jää ikuiseen silmukkaan millään π. Käännöksessä voidaan π:n suorituksen lopun tilalle laittaa return true ja jokainen π:n askel voidaan korvata seuraavalla:
if n > 0 then
n := n − 1
suorita π(σ):n askel
else
return F
Missä tapauksessa spapt(π, σ, n) jää ikuiseen silmukkaan? vastausEi missään. Edellä luvattiin, että π:n tutkiminen ei voi jäädä ikuiseen silmukkaan ja π(σ):n yhden askeleen suoritus vie äärellisen määrän spapt(π, σ, n):n askelia. Jos π(σ):n suoritus ei lopu koskaan, niin spapt(π, σ, n) jättää π(σ):n suorittamisen kesken n:n askeleen jälkeen, joten tässäkään vaiheessa spapt(π, σ, n) ei voi jäädä ikuiseen silmukkaan.
Yhden π(σ):n askeleen suorittaminen vie neljä askelta, jotka
ovat nämä
1. testi n > 0 ja sen perusteella then-haaraan meno
2. arvon n − 1 laskeminen
3. edellä saadun arvon sijoittaminen n:ään
4. π(σ):n askeleen suorittaminen.
Luku 4 ei ole yleispätevä vaan on valittu konkretian vuoksi, kuten edellä
todettiin.
Yleispätevää on, että
Jälkimmäinen pompula tarkoittaa, että hitaimmillaan spapt(π, σ, n) käyttää enemmän askelia kuin aliohjelman π suorittaminen syötteellä σ enintään n askelta veisi, siitä yksinkertaisesta syystä, että tällöin spapt(π, σ, n) suorittaa aliohjelman π syötteellä σ enintään n askelta ja tekee jotain muutakin. Aikaisemmin oli esimerkkejä, joissa aliohjelman suorittamien askelten määrä saatiin selville ihmisjärkeä käyttämällä paljon pienemmällä työmäärällä kuin aliohjelman suorittaminen olisi ihmiseltä vienyt. Jos sait laskettua, että väsi(1000002, 5):n suorittaminen vie 600 002 askelta, niin tuskinpa teit sitä suorittamalla kaikki yli kuusisataatuhatta askelta mielessäsi tai kynällä ja paperilla.
Vaikka edellä olleissa esimerkeissä päättelijänä oli ihminen, niissä käytettyjä kikkoja voisi toteuttaa myös aliohjelmina. Niitten avulla voitaisiin toteuttaa testeri, joka tuottaisi aina saman vastauksen kuin spapt(π, σ, n), mutta olisi ainakin joillakin π, σ ja n paljon nopeampi eikä koskaan olennaisesti hitaampi. Testeri testaisi, ovatko π ja σ kikan edellyttämää muotoa. Jos eivät ole, testeri toimisi kuten spapt(π, σ, n).
Kikat toimivat kuitenkin vain joillekin π ja σ. Seuraavaksi tutkimme, onko olemassa kaikille π ja σ toimivaa menetelmää, jolla vastaus kysymykseen ”pysähtyykö π(σ) viimeistään n:n askeleen jälkeen” saadaan aina nopeasti. Sitä varten annamme nimen palvelulle, jonka spapt(π, σ, n) tuottaa, ilman että rajoitamme millään tavalla sitä, miten se toteutetaan.
Määritelmä Askelrajoitetun pysähtymisen testeri on mikä tahansa aliohjelma apt(π, σ, n), jolla on seuraavat ominaisuudet. Jos π:n sisältö on aliohjelma, jonka syöte on yksi merkkijono ja joka pysähtyy viimeistään n askeleella syötteellä σ, niin apt(π, σ, n) = T. Muussa tapauksessa apt(π, σ, n) = F.
Voiko apt(π, σ, n) jäädä ikuiseen silmukkaan? vastausEi voi. Tämä luvattiin sanomalla, että jos apt(π, σ, n) ei ole T, niin se on F. apt(π, σ, n) ei siis koskaan jätä tuottamatta vastausta.
Koska spapt(π, σ, n) on askelrajoitetun pysähtymisen testeri ja sen askelmäärä todettiin edellä enintään lineaariseksi n:n suhteen, seuraava väite pätee:
Lause 1 Askelrajoitetun pysähtymisen testeri on olemassa. Suoritusajaltaan enintään n:n suhteen lineaarinen askelrajoitetun pysähtymisen testeri on olemassa.
Edellä totesimme, että jos π(σ) ei pysähdy viimeistään n:llä askeleella, spapt(π, σ, n):ltä menee enemmän kuin n askelta todeta tämä. Myös totesimme, että joillekin π ja σ tämä voidaan tehdä paljon nopeammin etsimällä vastaus muulla tavalla kuin miten spapt(π, σ, n) toimii. Seuraavaksi osoitamme, että ei ole olemassa kikkaa, jolla kaikilla π ja σ tulos saadaan paljon nopeammin. Valitaan mikä askelrajoitetun pysähtymisen testeri tahansa, on olemassa aliohjelmia ja syötteitä, joille testerin suorittaminen kestää melkein yhtä kauan kuin aliohjelman suoritus kestäisi. Väitteen tarkka muotoilu on seuraava:
Lause 2 On olemassa sellainen vakio b ∈ ℕ, että jokaiselle askelrajoitetun pysähtymisen testerille apt ja jokaiselle n ∈ ℕ on olemassa sellainen π, että apt(π, π, n):n suoritus vie ainakin n − b askelta.
Todistamme väitteen laatimalla tilanteen, jossa aliohjelman suoritus pyytää apt:ia kertomaan oman tulevaisuutensa eli mitä suoritus itse tulee tekemään. Aliohjelman syötteenä on siis aliohjelma itse. Jos apt vastaa, että suoritus tulee viemään enintään n askelta, niin aliohjelma jatkaa suorittamalla silmukan joka vie enemmän kuin n askelta. Siten aliohjelma huolehtii, että tämä vastaus on väärin. Jos apt vastaa, että suoritus tulee viemään enemmän kuin n askelta, niin aliohjelma lopettaa niin nopeasti kuin pystyy.
Koska pysähtymistesteri ei ole pysähtymistesteri ellei se vastaa aina oikein, ainoa mahdollisuus on, että jälkimmäinen vaihtoehto toteutuu ja suoritus todellakin vie enemmän kuin n askelta. Koska aliohjelma tässä tapauksessa tekee apt:n kutsumisen lisäksi hyvin vähän muuta, ainoa paikka jossa voi kulua paljon askelia on apt:n suoritus. Siksi apt:n suoritus vie tässä tapauksessa vääjäämättä melkein n askelta.
Tällainen tilanne saadaan aikaan palautelaatikon yläpuolelta löytyvällä ξn(σ):lla. Lukuarvo n on pantu alaindeksiin, koska se ei ole osa syötettä vaan on kirjoitettu sellaisenaan ohjelmakoodiin numeromerkeillä 0, 1, …, 9. Konkretisoidaksemme tätä tarkastelemme ensin tilannetta, jossa n:n arvo on tuhat, eli tarkastelemme seuraavaa aliohjelmaa:
ξ1000(σ ∈ Σ*) ∈ ℕ
j := 0
if apt(σ, σ, 1000) then
for i := 1 to 1000 do
j := j + 1
return j
Kutsun ξ1000(ξ1000) suoritus etenee ja kuluttaa suoritusaskelia seuraavasti:
Saimme siis tulokseksi, että jos ξ1000(ξ1000):n suoritus kestää enintään 1000 askelta, niin ξ1000(ξ1000):n suoritus kestää näin montaz + 4004 askelta (then-haara), ja jos ξ1000(ξ1000):n suoritus kestää yli 1000 askelta, niin ξ1000(ξ1000):n suoritus kestää näin montaz + 3 askelta (else-haara). Toinen näistä vaihtoehdoista on mahdoton. Kumpi ja miksi? vastausthen-haarassa suoritus kestää enintään 1000 ja täsmälleen z + 4004 askelta. Koska z on aliohjelman suoritusaskelten määrä ja siksi positiivinen, z + 4004 > 4004. Suoritus kestää siis enintään 1000 ja enemmän kuin 4004 askelta, mikä on mahdotonta.
Suoritus menee siis välttämättä xxxelse-haaran kautta. Katsomalla edeltä, kuinka monta askelta suoritus kestää tässä haarassa ja millä ehdolla tähän haaraan mennään, saamme tämänz + 3 > 1000 epäyhtälön. Sen ratkaisu on tämäz > 1000 − 3 = 997.
Kuten edellä totesimme, tarkat numeeriset arvot riippuvat ohjelmointikielen valinnasta. Ohjelmointikielen valinnasta riippumaton tulos on, että on olemassa jokin sellainen n:stä riippumaton positiivinen vakio b, että z > n − b.
Mitä ξn(ξn):n suorituksessa tapahtuu, jos apt:ina on spapt? vastausj nollataan ja käynnistetään spapt(ξn, ξn, n). Se tutkii onko ξn ajsoym, toteaa että se on, ja suorittaa ξn(ξn):ää enintään n askelta tai kunnes se pysähtyy. Tämä sisempi ξn(ξn):n suoritus alkaa samoin kuin ulompikin, eli nollaa oman j:nsä ja käynnistää spapt(ξn, ξn, n):n, joka tutkii ξn:n ja alkaa suorittaa ξn(ξn):ää. Näin syntyy uusia ja uusia sisäkkäisiä ξn(ξn):n suorituksia, joista jokainen ajaa omaa kopiotaan spapt(ξn, ξn, n):sta. Lopulta uloimman spapt(ξn, ξn, n):n askellaskuri eli n saavuttaa nollan, jolloin uloin spapt(ξn, ξn, n) lopettaa ja palauttaa F. Sen seurauksena uloin ξn(ξn) palauttaa 0. Uloimman spapt(ξn, ξn, n):n lopettaessa loppuvat samantien myös kaikki muut spapt(ξn, ξn, n):t ja kaikki paitsi uloin ξn(ξn), koska ne olivat vain simulaatio, simulaation sisältämä simulaatio, simulaation sisältämän simulaation sisältämä simulaatio ja niin edelleen uloimman spapt(ξn, ξn, n):n suorituksessa.
Ei ole vaikeaa kirjoittaa aliohjelma, jota toistuvasti kutsumalla saadaan kaikki merkkijonot lyhimmästä alkaen. Samanpituiset merkkijonot se tuottaa aakkosjärjestyksessä. Alla merkkejä ovat havainnollisuuden vuoksi vain numeromerkit. Merkistä saadaan seuraava lisäämällä siihen 1.
seuraava(σ ∈ Σ*) ∈ Σ*
i := 1
while i ≤ σ.pituus ∧ σ[i] = ’9’ do
σ[i] := ’0’
i := i + 1
if i ≤ σ.pituus then
σ[i] := σ[i] + 1
else
lisää σ:n loppuun '0'
Tyhjän syötteen pysähtymistesteri ottaa syötteekseen merkkijonon π ja palauttaa T tai F sen mukaan, onko π:n sisältö aliohjelma, jonka tuloksen tyyppi on merkkijono ja joka pysähtyy tyhjällä syötteellä. Jos tyhjän syötteen pysähtymistesteri olisi olemassa, niin jokaisella luonnollisella luvulla k voitaisiin toteuttaa seuraava aliohjelma κk. Alaindeksi k on while-silmukan ehdossa esiintyvän luvun nollien määrä.
κ4 ∈ Σ*
π := ””; τ := ”Merkkijonoja: ”
while π.pituus ≤ 10000 do
if π pysähtyy tyhjällä syötteellä then
suorita π tyhjällä syötteellä ja lisää sen tulos τ:n perään
π := seuraava(π)
return τ
Pysähtyykö κk:n suoritus? vastausKyllä. while-silmukan kierrosten määrää rajoittaa enintään 10k merkkiä pitkien merkkijonojen määrä, joka on äärellinen. if-lauseen testi oletettiin mahdolliseksi. π suoritetaan vain jos sen suoritus tulee pysähtymään. Kaikki muu on selvästi pysähtyvää.
Merkitsemme κ0:n pituutta m:llä. κk:n pituus on m + k. Olkoon π mikä tahansa aliohjelma, jonka pituus on enintään 10k, jonka tuloksen tyyppi on merkkijono ja joka pysähtyy tyhjällä syötteellä. Tästä syystäκk suorittaa π:n (ja kaikki muutkin samat ehdot täyttävät aliohjelmat) ja ottaa π:n tuloksen osaksi vastaustaan. κk:n vastauksessa on lisäksi muutakin, ainakin sana ”Merkkijonoja: ”. κk:n palauttaman merkkijonon pituus on enemmän kuin π:n palauttaman merkkijonon pituus.
Siksi κk ei voi olla π. Näin ollen κk:n pituus on enemmän kuin 10k, joten saamme m + k > 10k. Tämä on mahdotonta, jos valitaan tarpeeksi suuri k. Esimerkiksi valitsemalla k = m saadaan 2m > 10m, joka ei ole totta millään luonnollisella luvulla m.
Miksi meillä oli lupa valita k, kun yleensä todistuksissa väite pitää todistaa jokaiselle arvolle? Tästä syystäEdellä perusteltiin, että jos tyhjän syötteen pysähtymistesteri on olemassa, niin κk on olemassa jokaisella k ∈ ℕ. Jos yhdelläkin k syntyy ristiriita, ei κk ole olemassa jokaisella k ∈ ℕ, joten tyhjän syötteen pysähtymistesteriäkään ei ole.
Edellisessä luvussa otimme askeleen kohti Kolmogorov-kompleksisuutta. Siinä merkkijonon sisältämän informaation määräksi määritellään lyhyimmän sellaisen aliohjelman pituus, joka tyhjällä syötteellä tulostaa kyseessä olevan merkkijonon ja pysähtyy. Kolmogorov-kompleksisuus vastaa hyvin intuitiotamme siitä, että merkkijono ”Oikein!” sisältää enemmän informaatiota kuin yhtä pitkä merkkijono ”ooooooo”. Kolmogorov-kompleksisuuden käyttökelpoisuutta vähentää todella raju ratkeamattomuustulos, johon ehkä vielä joskus tutustumme.