Teh­tä­vä:
Py­säh­ty­mis­tes­te­rin mah­dot­to­muus

Ly­hyt Math­Check-oh­je (uu­teen vä­li­leh­teen)

Tie­to­jen­kä­sit­te­ly­tie­de al­koi Alan Tu­rin­gin jul­kai­sus­ta vuon­na 1936. Sii­nä hän esit­ti ma­te­maat­ti­sen mal­lin tie­to­ko­neil­le ja nii­den oh­jel­mil­le se­kä to­dis­ti, et­tä on ole­mas­sa teh­tä­viä, jot­ka näyt­tä­vät tie­to­ko­neil­le so­pi­vil­ta, mut­ta joi­ta ei kui­ten­kaan voi rat­kais­ta yleis­pä­te­väs­ti tie­to­ko­neil­la.

Kos­ka tuol­loin ei ol­lut oh­jel­moin­ti­kie­liä, Tu­ring jou­tui se­lit­tä­mään mo­net asiat vai­keas­ti. Rat­kea­mat­to­mien teh­tä­vien ole­mas­sa­olo on ny­kyi­sin to­dis­tet­ta­vis­sa hy­vin yk­sin­ker­tai­ses­ti ve­toa­mal­la oh­jel­moin­nis­ta tut­tui­hin asioi­hin. Tus­kin mi­kään muu ma­te­maat­tis­ten tie­tei­den suu­ris­ta saa­vu­tuk­sis­ta on yh­tä help­po ym­mär­tää lä­pi­ko­tai­sin yh­tä vä­hil­lä taus­ta­tie­doil­la!

Täs­sä teh­tä­väs­sä to­dis­te­taan, et­tä ky­sy­mys py­säh­tyy­kö an­net­tu oh­jel­ma an­ne­tul­la syöt­teel­lä on rat­kea­ma­ton. Sit­ten joh­de­taan joi­ta­kin jat­ko­tu­lok­sia, jot­ka ker­to­vat, et­tä rat­kea­mat­to­muus on hy­vin ylei­nen il­miö. Koo­din­pät­kien toi­siin­sa liit­tä­mi­sen hel­pot­ta­mi­sek­si ko­ko ajan pu­hu­taan ali­oh­jel­mis­ta, mut­ta tu­lok­set pä­te­vät myös oh­jel­mil­le, kos­ka ali­oh­jel­mas­ta on help­po teh­dä oh­jel­ma li­sää­mäl­lä pää­oh­jel­ma jo­ka kut­suu si­tä.

  1. Merk­ki­jo­not ja ali­oh­jel­mat
  2. Py­säh­ty­mis­tes­te­ri
  3. Tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri
  4. Osit­tai­nen tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri
  5. Ri­cen lau­se
  6. Lo­puk­si

Merk­ki­jo­not ja ali­oh­jel­mat

En­nen kuin voim­me käy­dä kä­sik­si pää­asiaan, mei­dän täy­tyy ot­taa käyt­töön muu­ta­mia mer­kin­tö­jä. Oi­keil­la oh­jel­moin­ti­kie­lil­lä syn­tyi­si pit­kiä il­mauk­sia, jois­sa pää­asia huk­kuu sen kan­nal­ta mer­ki­tyk­set­tö­mien yk­si­tyis­koh­tien al­le. Sik­si käy­täm­me ma­te­ma­tii­kas­ta ja tie­to­jen­kä­sit­te­ly­tie­tees­tä pe­räi­sin ole­via mer­kin­tö­jä.

Ku­ten ma­te­ma­tii­kas­sa ja tie­to­jen­kä­sit­te­ly­tie­tees­sä on ta­pa­na, pie­net kreik­ka­lai­set kir­jai­met σ, ρ, π ja niin edel­leen ovat muut­tu­jia, joi­den tyyp­pi on merk­ki­jo­no. Kaik­kien merk­ki­jo­no­jen jouk­koa mer­ki­tään Σ*. Niin­pä σ ∈ Σ* tar­koit­taa, et­tä σ:n tyyp­pi on merk­ki­jo­no. Myös merk­ki­jo­no­va­kioi­den ku­ten ”talo” tyyp­pi on merk­ki­jo­no. Sik­si ”talo” ∈ Σ*. Merk­ki­jo­no­va­kion al­ku ja lop­pu osoi­te­taan ”:lla, jot­ta sii­nä voi­si ol­la muun muas­sa vä­li­lyön­te­jä ja sil­ti erot­tui­si, mis­tä se al­kaa ja mi­hin se lop­puu. Merk­ki­jo­non σ pi­tuut­ta mer­ki­tään |σ|. Esi­mer­kik­si |”talo”| = 4, |”merkkijono”| = 10 ja |””| = 0.

Kuin­ka pal­jon on |”voi ei!”|?
tai

Muut­tu­jat i, j, …, n si­säl­tä­vät luon­nol­li­sia lu­ku­ja 0, 1, 2, … eli nii­den tyyp­pi on luon­nol­li­nen lu­ku. Luon­nol­lis­ten lu­ku­jen jouk­koa mer­ki­tään ℕ:llä. Esi­mer­kik­si 0 ∈ ℕ ja m ∈ ℕ. Käy­täm­me myös tyyp­piä to­tuus­ar­vo eli 𝔹. To­tuus­ar­vo­va­kioi­ta on kak­si: F eli epä­to­si ja T eli to­si. Siis 𝔹 = {F, T}. Muut­tu­jien ni­mis­sä voi ol­la ala­in­dek­se­jä tyy­liin σ1 tai ni. Kun tar­vit­sem­me hel­pos­ti muis­tet­ta­vaa ni­meä, kir­joi­tam­me esi­mer­kik­si laskuri ja ker­rom­me tyy­pin erik­seen.

Mi­kä on seu­raa­vien olen­to­jen tyyp­pi sa­noi­na il­mais­tu­na, ja mi­kä on tyy­pin jouk­ko­sym­bo­li? 253luon­nol­li­nen lu­ku ℕ ”253”merk­ki­jo­no Σ* |”talo”|luon­nol­li­nen lu­ku ℕ Fto­tuus­ar­vo 𝔹 ρnmerk­ki­jo­no Σ* m + 1luon­nol­li­nen lu­ku ℕ n > 2to­tuus­ar­vo 𝔹 n > 2”merk­ki­jo­no Σ* Mal­li­vas­taus tu­lee nä­ky­viin siir­tä­mäl­lä kur­so­ri rus­kean alueen pääl­le.

Ole­tam­me, et­tä on va­lit­tu jo­kin yleis­käyt­töi­nen oh­jel­moin­ti­kie­li. Kaik­ki jat­kos­sa mai­nit­ta­vat ali­oh­jel­mat on kir­joi­tet­tu sil­lä. Ali­oh­jel­mat­kin ovat merk­ki­jo­no­ja. Jos π on ali­oh­jel­ma, jon­ka syö­te on yk­si merk­ki­jo­no, niin mer­kin­näl­lä π(σ) tar­koi­tam­me ti­lan­tees­ta riip­puen π:n suo­ri­tus­ta syöt­teel­lä σ tai tä­män suo­ri­tuk­sen tu­los­ta. Vas­taa­vas­ti π(σ, ρ, i):n syö­te koos­tuu kah­des­ta merk­ki­jo­nos­ta ja yh­des­tä luon­nol­li­ses­ta lu­vus­ta.

Jos ali­oh­jel­man suo­ri­tus py­säh­tyy, niin sen tu­los on lu­ku, merk­ki­jo­no tai to­tuus­ar­vo. Jos ali­oh­jel­man suo­ri­tus ei py­säh­dy, niin sa­nom­me, et­tä tu­los on ⊥. Niin­pä π(σ) = ⊥ tar­koit­taa, et­tä π(σ) ei py­säh­dy. Sym­bo­li ⊥ ei kuu­lu ali­oh­jel­man tu­lok­sen tyyp­piin vaan il­mai­see, et­tä ali­oh­jel­ma jää ikui­seen sil­muk­kaan ei­kä sik­si pa­lau­ta mi­tään.

Seu­raa­van ali­oh­jel­man ni­mi tu­lee sa­nas­ta ”vä­hen­nys­sil­muk­ka”. Al­le­vii­vat­tu ri­vi il­moit­taa ali­oh­jel­man ni­men, pa­ra­met­rit tyyp­pei­neen ja tu­lok­sen tyy­pin.

väsi(n ∈ ℕ, m ∈ ℕ) ∈ ℕ
while nm do
   n := n − m
return n

Ali­oh­jel­man pa­ra­met­rit vä­li­te­tään me­ka­nis­mil­la, jo­ta kut­su­taan ar­von vä­li­tyk­sek­si. Olen­nais­ta sii­nä on, et­tä ali­oh­jel­man pa­ra­met­rin­sa ar­vol­le te­ke­mät muu­tok­set ei­vät näy kut­su­jal­le. Vaik­ka ali­oh­jel­man pa­ra­met­ril­la oli­si sa­ma ni­mi kuin kut­su­jan muut­tu­jal­la, ne ovat sil­ti eril­li­set muut­tu­jat. Esi­mer­kik­si jos n = 5 ja kut­su­taan väsi(n, 2), niin kut­sun jäl­keen­kin kut­su­jan n on 5 vaik­ka väsi:n n muut­tui yk­kö­sek­si.

Ali­oh­jel­mia voi käyt­tää tois­ten­sa ali­oh­jel­mi­na. Niin­pä esi­mer­kik­si π( π1(σ), π2(ρ, i) ) tar­koit­taa ali­oh­jel­maa, jo­ka suo­rit­taa π1:n syöt­teel­lä σ ja π2:n syöt­teel­lä, jon­ka osat ovat ρ ja i. Sit­ten se käyt­tää näin saa­tu­ja tu­lok­sia π:n syöt­tee­nä ja suo­rit­taa π:n.

Ole­tam­me seu­raa­vis­sa ky­sy­myk­sis­sä, et­tä π(3) = 5, π(4) = ⊥, ja et­tä κ(n, m) las­kee ker­to­las­kun n ⋅ π(m) ja pa­laut­taa tu­lok­sen.

Py­säh­ty­mis­tes­te­ri

Mää­ri­tel­mä Py­säh­ty­mis­tes­te­ri on mi­kä ta­han­sa ali­oh­jel­ma pt, jol­la on seu­raa­vat omi­nai­suu­det. Sen syö­te on kak­si merk­ki­jo­noa ja tu­los on to­tuus­ar­vo. Jos π:n si­säl­tö on ali­oh­jel­ma, jon­ka syö­te on yk­si merk­ki­jo­no ja jo­ka py­säh­tyy syöt­teel­lä σ, niin pt(π, σ) = T. Muus­sa ta­pauk­ses­sa pt(π, σ) = F.

Mi­kä on kut­sun pt(π, σ) tu­los, jos π:n si­säl­tö ei ole ali­oh­jel­ma vaan jo­kin muu merk­ki­jo­no? vas­tausF

Mi­kä on kut­sun pt(väsi, ”5, 2”) tu­los? vas­tausF, kos­ka väsi:n syö­te ei ole yk­si merk­ki­jo­no vaan kak­si luon­nol­lis­ta lu­kua.

Ol­koon seu­raa­vis­sa ky­sy­myk­sis­sä π(σ) ali­oh­jel­ma, jo­ka tun­nis­taa σ:n alus­ta kak­si pil­kul­la toi­sis­taan ero­tet­tua luon­nol­lis­ta lu­kua n ja m, ja sit­ten kut­suu väsi(n, m) ja pa­laut­taa sen tu­lok­sen oma­na tu­lok­se­naan.

Ali­oh­jel­ma pt ei voi toi­mia si­ten, et­tä se ajaa π(σ):n ja kat­soo py­säh­tyy­kö se, sil­lä niin toi­mi­va pt(π, σ) epä­on­nis­tui­si täl­lä ta­val­laJos π(σ) ei py­säh­dy, niin sel­lai­nen pt(π, σ) jää ikui­ses­ti odot­ta­maan π(σ):n vas­taus­ta ei­kä niin ol­len it­se­kään py­säh­dy.. Siis pä­ti­si pt(π, σ) = ⊥, vaik­ka pi­täi­si ol­la pt(π, σ) = F. Jat­kos­sa kä­si­te ”tes­te­ri” si­säl­tää ai­na vaa­ti­muk­sen, et­tä se py­säh­tyy kai­kil­la syöt­teil­lä. Jos ha­lu­taan luo­pua täs­tä vaa­ti­muk­ses­ta, niin käy­te­tään ter­miä ”osit­tai­nen tes­te­ri”.

To­dis­tam­me, et­tä pt ei voi toi­mia mil­lään muul­la­kaan ta­val­la; to­dis­tam­me siis, et­tä py­säh­ty­mis­tes­te­rei­tä ei ole ole­mas­sa. Teem­me sen ot­ta­mal­la tar­kas­te­luun min­kä ta­han­sa ali­oh­jel­man χ, jol­la on sa­ma syöt­teen ja tu­lok­sen tyyp­pi kuin pt:llä, ja to­dis­ta­mal­la, et­tä ai­na­kin yh­del­lä syöt­teel­lä se ei vas­taa lain­kaan tai vas­taa eri ta­val­la kuin py­säh­ty­mis­tes­te­ri vas­tai­si. Kos­ka se ei vas­taa ai­na ku­ten py­säh­ty­mis­tes­te­ri vas­tai­si, se ei ole py­säh­ty­mis­tes­te­ri. Päät­te­ly to­teu­te­taan si­ten, et­tä se pä­tee jo­kai­sel­le ali­oh­jel­mal­le, jol­la on sa­ma syöt­teen ja tu­lok­sen tyyp­pi kuin py­säh­ty­mis­tes­te­ril­lä. Sik­si mi­kään ali­oh­jel­ma ei voi ol­la py­säh­ty­mis­tes­te­ri.

Ol­koon siis χ mi­kä ta­han­sa ali­oh­jel­ma, jo­ka ot­taa syöt­teek­seen kak­si merk­ki­jo­noa, ja pa­laut­taa to­tuus­ar­von tai ei py­säh­dy. Osoi­tam­me koh­ta, et­tä χ(π, σ) vas­taa eri ta­val­la kuin py­säh­ty­mis­tes­te­ri vas­tai­si tai ei vas­taa lain­kaan, jos π = σ = ξχ, mis­sä ξχ on seu­raa­va ali­oh­jel­ma:

ξχ(σ ∈ Σ*) ∈ ℕ
n := 0
if χ(σ, σ) then
   while n ≥ 0 do
      n := n − 0
return n

Täs­sä χ on ala­in­dek­si­nä ko­ros­ta­mas­sa si­tä, et­tä jo­kai­sel­la χ on iki­oma ξχ (sen si­jaan et­tä oli­si yk­si ξ jo­ta käyt­täi­sim­me kai­kil­le χ). Em­me kir­joi­ta ξ(χ, σ), kos­ka se tar­koit­tai­si et­tä χ on osa ξ:n syö­tet­tä. Si­tä se ei ole, vaan χ on osa ali­oh­jel­man ξχ koo­dia.

Kah­des­sa jäl­kim­mäi­ses­sä ta­pauk­ses­sa ξχχ) it­se huo­leh­tii, et­tä χ(ξχ, ξχ):n vas­taus on eri kuin mi­tä py­säh­ty­mis­tes­te­ri vas­tai­si, pyy­tä­mäl­lä χ(ξχ, ξχ):n vas­tauk­sen ja sit­ten te­ke­mäl­lä päin­vas­toin.

Olem­me to­dis­ta­neet seu­raa­van lau­seen:

Lau­se 1 Py­säh­ty­mis­tes­te­riä ei ole ole­mas­sa. Toi­sin sa­noen, ei voi­da kir­joit­taa ali­oh­jel­maa, jo­ka ot­taa syöt­teek­seen merk­ki­jo­not π ja σ ja vas­taa ai­na oi­kein ky­sy­myk­seen ”on­ko π ali­oh­jel­ma, jo­ka ot­taa syöt­teek­seen yh­den merk­ki­jo­non, ja py­säh­tyy jos tä­mä merk­ki­jo­no on σ”.

Kyl­lä/ei-ky­sy­mys­tä sa­no­taan rat­kea­mat­to­mak­si, jos ja vain jos ei ole ole­mas­sa ali­oh­jel­maa, jo­ka py­säh­tyy kai­kil­la syöt­teil­lä ja pa­laut­taa T tai F sen mu­kaan on­ko ky­sy­myk­sen vas­taus an­ne­tul­la syöt­teel­lä ”kyl­lä” vai ”ei”. Olem­me juu­ri to­dis­ta­neet, et­tä seu­raa­va ky­sy­mys, jo­ka saa syöt­teek­seen merk­ki­jo­not π ja σ, on rat­kea­ma­ton: ”esit­tää­kö π ali­oh­jel­maa, jon­ka syö­te on yk­si merk­ki­jo­no, ja jo­ka py­säh­tyy jos se aje­taan syöt­tee­nään σ”.

Tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri

Tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri on muu­ten sa­man­lai­nen kuin py­säh­ty­mis­tes­te­ri, mut­ta se ot­taa syöt­teek­seen vain yh­den merk­ki­jo­non ja tut­kii, esit­tää­kö se ali­oh­jel­maa, jon­ka syö­te on yk­si merk­ki­jo­no ja jo­ka py­säh­tyy jos tä­mä merk­ki­jo­no on tyh­jä.

Mää­ri­tel­mä Tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri on mi­kä ta­han­sa ali­oh­jel­ma tspt, jol­la on seu­raa­vat omi­nai­suu­det. Jos π:n si­säl­tö on ali­oh­jel­ma, jon­ka syö­te on yk­si merk­ki­jo­no ja jo­ka py­säh­tyy syöt­teel­lä ””, niin tspt(π) = T. Muus­sa ta­pauk­ses­sa tspt(π) = F.

Tar­vit­sem­me jat­kos­sa useas­ti il­maus­ta ”ali­oh­jel­ma, jon­ka syö­te on yk­si merk­ki­jo­no”. Sik­si an­nam­me sil­le ly­hen­teen aj­soym.

Tyh­jän syöt­teen py­säh­ty­mis­tes­te­rei­tä­kään ei ole ole­mas­sa. To­dis­tam­me tä­män olet­ta­mal­la, et­tä sel­lai­nen on ole­mas­sa, ja ra­ken­ta­mal­la sen avul­la py­säh­ty­mis­tes­te­rin. Näin pää­dy­tään ris­ti­rii­taan Lau­seen 1 kans­sa, jo­ten tyh­jän syöt­teen py­säh­ty­mis­tes­te­rei­tä ei ole ole­mas­sa.

Tar­vit­sem­me kei­non si­säl­lyt­tää merk­ki­jo­no­va­kioon lai­naus­merk­ki. Käy­täm­me sa­maa rat­kai­sua kuin mo­nis­sa oh­jel­moin­ti­kie­lis­sä: pelk­kä ” tar­koit­taa merk­ki­jo­non lop­pua, mut­ta \” tar­koit­taa merk­ki­jo­non si­säl­lä ole­vaa lai­naus­merk­kiä. Seu­raa­va C++-esi­merk­ki ha­vain­nol­lis­taa tä­tä.

lau­setu­los­taa
std::cout << "Se on " << n << "!";Se on 3!
std::cout << "Se on \" << n << \"!";  Se on " << n << "!

Kuin­ka mon­ta ja min­kä­tyyp­pi­siä pa­ra­met­re­ja std::cout saa ylä­ri­vis­säkol­me: merk­ki­jo­no, lu­ku, merk­ki­jo­no? En­tä ala­ri­vis­säyh­den: merk­ki­jo­no?

Kuin­ka pit­kä on std::cout:n en­sim­mäi­sek­si saa­ma merk­ki­jo­no ylä­ri­vis­sä? En­tä ala­ri­vis­sä?
tai

Merk­ki­jo­no­jen lait­ta­mi­nen pe­räk­käin esi­te­tään ma­te­ma­tii­kas­sa lait­ta­mal­la nii­tä edus­ta­vat sym­bo­lit pe­räk­käin. Jos esi­mer­kik­si σ = ”pii” ja ρ = ”rakka”, niin σρ = ”piirakka”. (Kit­ti­län Le­vil­lä on sen ni­mi­nen tie.) Il­maus ”σ := \””ρ”\”” ra­ken­taa merk­ki­jo­non lait­ta­mal­la pe­räk­käin kol­me osaa, jois­ta en­sim­mäi­nen koos­tuu näis­tä mer­keis­täσ
vä­li­lyön­ti
:
=
vä­li­lyön­ti
; kes­kim­mäi­nen on tä­mäρ:n si­säl­tö; ja vii­mei­nen on tä­mä. Jos ρ = ”hauva”, niin ”σ := \””ρ”\”” = tä­mä”σ := \”hauva\””.

Ol­koon koodin_alkuun(α, β) ali­oh­jel­ma, jo­ka tul­kit­see merk­ki­jo­non α si­säl­töä ali­oh­jel­mak­si kun­nes löy­tää koh­dan jos­sa pa­ra­met­rien ja tu­lok­sen tyy­pin mää­rit­te­ly lop­puu ja suo­ri­tet­ta­va koo­di al­kaa, li­sää sii­hen merk­ki­jo­non β omal­le ri­vil­leen, ja pa­laut­taa tu­lok­sen. Kai­kil­la syöt­teil­lä py­säh­ty­vä oi­kein toi­mi­va koodin_alkuun voi­daan to­teut­taa, sil­lä li­säyk­sen paik­ka löy­tyy kään­tä­jä­tek­nii­kal­la ja muu on help­poa. Esi­mer­kik­si jos π on

π(σ ∈ Σ*) ∈ ℕ
k := |σ|
return 2k + 1

niin koodin_alkuun(π, ”σ := \”hauva\””) on

π(σ ∈ Σ*) ∈ ℕ
σ := ”hauva”
k := |σ|
return 2k + 1

Jäl­kim­mäi­sel­lä on sa­ma ni­mi, syö­te ja tu­lok­sen tyyp­pi kuin edel­li­sel­lä, mut­ta jäl­kim­mäi­nen ei käy­tä saa­maan­sa syö­tet­tä σ mi­hin­kään, vaan toi­mii kai­kil­la syöt­teil­lä ku­ten π(”hauva”).
Edel­li­sel­le π(”hevonen”) = . tai
Jäl­kim­mäi­sel­le π(”hevonen”) = . tai

Jos tspt oli­si ole­mas­sa, niin voi­tai­siin kir­joit­taa ali­oh­jel­ma γ(π, ρ), jo­ka en­sin li­sää π:n suo­ri­tet­ta­van osan al­kuun si­joi­tus­lau­seen, jos­sa π:n syö­te kor­va­taan ρ:sta saa­dul­la merk­ki­jo­no­va­kiol­la. Sit­ten se tes­taa näin muu­te­tun π:n tspt:llä ja pa­laut­taa tes­tin tu­lok­sen. Jot­ta al­ku­pe­räi­nen ja muu­tet­tu π ei­vät me­ni­si se­kai­sin, mer­kit­sem­me al­ku­pe­räis­tä π:llä ja muu­tet­tua πρ:lla.

γ(π ∈ Σ*, ρ ∈ Σ*) ∈ 𝔹
πρ := koodin_alkuun(π, ”σ := \””ρ”\””)
return tsptρ)
Se käyt­täy­tyy seu­raa­vas­ti:

Siis γ(π, ρ) tuot­taa ai­na sa­man tu­lok­sen kuin py­säh­ty­mis­tes­te­ri tuot­tai­si, jo­ten γ(π, ρ) on py­säh­ty­mis­tes­te­ri. Olem­me osoit­ta­neet, et­tä jos tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri oli­si ole­mas­sa, niin sen avul­la voi­tai­siin to­teut­taa py­säh­ty­mis­tes­te­ri. Lau­seen 1 mu­kaan py­säh­ty­mis­tes­te­riä ei ole ole­mas­sa, jo­ten saam­me lau­seen 2:

Lau­se 2 Tyh­jän syöt­teen py­säh­ty­mis­tes­te­riä ei ole ole­mas­sa.

Osit­tai­nen tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri

Mää­ri­tel­mä Osit­tai­nen tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri on mi­kä ta­han­sa ali­oh­jel­ma otspt, jol­la on seu­raa­vat omi­nai­suu­det. Se ot­taa syöt­teek­seen yh­den merk­ki­jo­non ja pa­laut­taa F tai T tai jää ikui­seen sil­muk­kaan. Jos otspt(π) = T, niin π:n si­säl­tö on aj­soym jo­ka py­säh­tyy syöt­teel­lä ””. Jos otspt(π) = F, niin π:n si­säl­tö ei ole aj­soym tai sei ei py­säh­dy syöt­teel­lä ””.

Osit­tai­sia tyh­jän syöt­teen py­säh­ty­mis­tes­te­rei­tä on ole­mas­sa. Niis­tä yk­sin­ker­tai­sin (ja hyö­dyt­tö­min) on aj­soym, jon­ka tu­lok­sen tyyp­pi on to­tuus­ar­vo ja jo­ka jää kai­kil­la syöt­teil­lä ikui­seen sil­muk­kaan.

surkea_otspt(σ ∈ Σ*) ∈ 𝔹
while T do
   n := 0
return F

Hie­man pa­rem­pi aloit­taa tut­ki­mal­la, esit­tää­kö sen syö­te π aj­soy­mia (tä­mä osa­taan teh­dä ja sii­hen tar­vit­ta­via me­ne­tel­miä kä­si­tel­lään muun muas­sa kään­tä­jä­tek­nii­kan kurs­seil­la). Jos ei esi­tä, se pa­laut­taa F. Jos esit­tää, se ajaa π(””) ja sen val­mis­tut­tua pa­laut­taa T. Mi­tä tä­mä osit­tai­nen tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri te­kee, jos π on aj­soym, jo­ka ei py­säh­dy tyh­jäl­lä syöt­teel­lä? vas­tausJää ikui­seen sil­muk­kaan.

Vie­lä pa­rem­pi osit­tai­nen tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri saa­daan li­sää­mäl­lä π:n tut­ki­mi­sen ja π(””):n aja­mi­sen vä­liin tes­te­jä, jois­sa tun­nis­te­taan tyh­jäl­lä syöt­teel­lä ikui­seen sil­muk­kaan jää­viä ali­oh­jel­mia ja pa­lau­te­taan niil­le F. Seu­raa­va ali­oh­jel­ma ha­vain­nol­lis­taa tä­tä aja­tus­ta.

parempi_otspt(π ∈ Σ*) ∈ 𝔹
if π:n si­säl­tö ei ole aj­soym then
   return F
if π = surkea_otspt then
   return F
if π = jokin_toinen_pysähtymätön then
   return F
π(””)
return T

Jos jol­la­kin osit­tai­sel­la tyh­jän syöt­teen py­säh­ty­mis­tes­te­ril­lä oli­si vain 7 syö­tet­tä, joil­la se jää ikui­seen sil­muk­kaan, niin sii­hen voi­tai­siin li­sä­tä tes­tit, jot­ka tun­nis­ta­vat ne ja pa­laut­ta­vat niil­le F. Näin saa­tai­siin osit­tai­nen tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri, jo­ka py­säh­tyy kai­kil­la syöt­teil­lä. Tä­mä ei kui­ten­kaan voi on­nis­tua, kos­ka Sel­lai­nen osit­tai­nen tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri oli­si tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri, mut­ta tyh­jän syöt­teen py­säh­ty­mis­tes­te­riä ei ole ole­mas­sa.

Tä­mä pä­tee tie­ten­kin, oli­pa 7:n pai­kal­la mi­kä ta­han­sa luon­nol­li­nen lu­ku. Olem­me to­dis­ta­neet seu­raa­van.

Lau­se 3 Jo­kai­sel­la osit­tai­sel­la tyh­jän syöt­teen py­säh­ty­mis­tes­te­ril­lä on ää­ret­tö­män mon­ta syö­tet­tä, joil­la se jää ikui­seen sil­muk­kaan.

Ri­cen lau­se

Päät­te­lyis­säm­me on tyy­pil­li­ses­ti ol­lut kol­me haa­raa: tut­kit­ta­va merk­ki­jo­no ei ole aj­soym, se on aj­soym jo­ka py­säh­tyy tut­kit­ta­val­la syöt­teel­lä, tai se on aj­soym jo­ka ei py­säh­dy tut­kit­ta­val­la syöt­teel­lä. Tä­hän men­nes­sä on toi­vot­ta­vas­ti tul­lut sel­väk­si, et­tä asian ydin on kah­des­sa jäl­kim­mäi­ses­sä. Jat­kos­sa unoh­dam­me ta­pauk­sen ”ei ole aj­soym” luot­taen sii­hen, et­tä se voi­daan hoi­taa ku­ten edel­lä.

Tä­män ala­lu­vun ajan ole­tam­me, et­tä mer­kis­tö si­säl­tää ai­na­kin nu­me­ro­mer­kit 0, 1, …, 9 ja isot kir­jai­met A, B, …, Z.

Tar­kas­te­lem­me ky­sy­mys­tä ”on­ko π aj­soym, jo­ka py­säh­tyy ai­na­kin niil­lä syöt­teil­lä, jois­sa esiin­tyy kir­jain A?” Jos sil­le oli­si ole­mas­sa tes­te­ri testaa_A, niin voi­tai­siin kir­joit­taa ali­oh­jel­ma χ(π, σ), jo­ka en­sin si­joit­taa muut­tu­jaan ξ merk­ki­jo­no­va­kion jo­ka si­säl­tää al­la ole­van ali­oh­jel­man ξπ, σ, ja sit­ten tes­taa sen.

ξπ, σ(ρ ∈ Σ*) ∈ 𝔹
π(σ)
return T

Siis näin:

χ(π, σ)
ξ := ξπ, σ
return testaa_A(ξ)

Voi­ko χ(π, σ) jää­dä ikui­seen sil­muk­kaan? vas­tausEi voi. Ali­oh­jel­man ξπ, σ kir­joit­ta­mi­nen on yk­sin­ker­tais­ta merk­ki­jo­no­jen kä­sit­te­lyä, jo­ka saa­daan on­nis­tu­maan ai­na. Kut­su testaa_A(ξ) ei kos­kaan jää ikui­seen sil­muk­kaan, kos­ka ali­oh­jel­maa ei sa­no­ta tes­te­rik­si, jol­lei se py­säh­dy kai­kil­la syöt­teil­lä. Tes­te­rin kal­tais­ta ali­oh­jel­maa, jol­la on lu­pa jää­dä joil­la­kin syöt­teil­lä ikui­seen sil­muk­kaan, kut­su­taan täl­lä ter­mil­läosit­tai­nen tes­te­ri.

Jos π py­säh­tyy syöt­teel­lä σ, niin ξπ, σ(”Sano AA!”) te­kee näinPy­säh­tyy ja pa­laut­taa T. ja ξπ, σ(”Enkä.”) te­kee näinPy­säh­tyy ja pa­laut­taa T.. Mi­tä ξπ, σ te­kee muil­la syöt­teil­lä? vas­tausPy­säh­tyy ja pa­laut­taa T. Sen käyt­täy­ty­mi­nen ei rii­pu syöt­tees­tä. Merk­ki­jo­not π ja σ ei­vät ole osa sen syö­tet­tä, vaan ne on kir­joi­tet­tu ξπ, σ:n koo­diin sel­lai­si­naan. ξπ, σ:n syö­te on ρ. Kut­su χ(π, σ) pa­laut­taa tä­mänT, kos­ka ξπ, σ py­säh­tyy ai­na­kin niil­lä syöt­teil­lä, jois­sa esiin­tyy kir­jain A, kos­ka se py­säh­tyy ai­van kai­kil­la syöt­teil­lä..

Jos π ei py­säh­dy syöt­teel­lä σ, niin ξπ, σ(”Sano AA!”) te­kee näinEi py­säh­dy. ja ξπ, σ(”Enkä.”) te­kee näinEi py­säh­dy.. Mi­tä ξπ, σ te­kee muil­la syöt­teil­lä? vas­tausEi py­säh­dy. Ku­ten edel­lä, sen käyt­täy­ty­mi­nen ei rii­pu syöt­tees­tä. Kut­su χ(π, σ) pa­laut­taa tä­mänF, kos­ka ξπ, σ ei py­säh­dy edes niil­lä syöt­teil­lä, jois­sa esiin­tyy kir­jain A, kos­ka se ei py­säh­dy mil­lään syöt­teil­lä..

Siis χ(π, σ) py­säh­tyy ai­na ja vas­taa ku­ten py­säh­ty­mis­tes­te­ri vas­tai­si. Se siis oli­si py­säh­ty­mis­tes­te­ri! Näin ei voi ol­la, kos­ka Lau­seen 1 mu­kaan py­säh­ty­mis­tes­te­riä ei ole ole­mas­sa. Niin­pä ali­oh­jel­maa testaa_A ei ole ole­mas­sa, jo­ten ky­sy­mys ”on­ko π aj­soym, jo­ka py­säh­tyy ai­na­kin niil­lä syöt­teil­lä, jois­sa esiin­tyy kir­jain A?” on rat­kea­ma­ton.

Täs­sä päät­te­lys­sä ei ol­len­kaan hyö­dyn­net­ty si­tä, et­tä ky­sy­mys kos­ki A-kir­jain­ten esiin­ty­mis­tä syöt­tees­sä. Päät­te­ly toi­mii sel­lai­se­naan mil­le ta­han­sa ky­sy­myk­sel­le, jol­le ”kyl­lä” on oi­kea vas­taus jo­kai­sel­le aj­soy­mil­le, jo­ka py­säh­tyy kai­kil­la syöt­teil­lä, ja ”ei” on oi­kea vas­taus jo­kai­sel­le aj­soy­mil­le, jo­ka ei py­säh­dy mil­lään syöt­teel­lä. Mit­kä seu­raa­vis­ta ovat täl­lai­sia ky­sy­myk­siä? On­ko π aj­soym, jo­ka py­säh­tyy …
… ai­na­kin niil­lä syöt­teil­lä, joi­den pi­tuus on pa­ril­li­nen?
… täs­mäl­leen niil­lä syöt­teil­lä, jois­sa esiin­tyy kir­jain A?
… jol­la­kin syöt­teel­lä, jo­ka muo­dos­tuu vain nu­me­ro­mer­keis­tä ja jon­ka esit­tä­mä lu­ku on al­ku­lu­ku?
… vain ää­rel­li­sel­lä mää­räl­lä eri­lai­sia syöt­tei­tä?
tai

En­tä seu­raa­vis­ta? On­ko π aj­soym, jo­ka py­säh­tyy ai­na­kin …
… jo­kai­sel­la syöt­teel­lä, jon­ka pi­tuus on enin­tään kak­si ja jos­sa esiin­tyy täs­mäl­leen seit­se­män A-kir­jain­ta? vih­jeSel­lai­sia syöt­tei­tä ei ole ole­mas­sa­kaan. Sik­si jo­kai­nen ali­oh­jel­ma, jo­pa surkea_otspt, py­säh­tyy jo­kai­sel­la sel­lai­sel­la syöt­teel­lä.
… jol­la­kin syöt­teel­lä, jon­ka pi­tuus on enin­tään kak­si ja jos­sa esiin­tyy täs­mäl­leen seit­se­män A-kir­jain­ta? vih­jeSel­lai­sia syöt­tei­tä ei ole ole­mas­sa­kaan. Sik­si mi­kään ali­oh­jel­ma ei py­säh­dy mil­lään sel­lai­sel­la syöt­teel­lä, ei vaik­ka ali­oh­jel­ma py­säh­tyi­si jo­kai­sel­la syöt­teel­lä.
tai

Pie­nel­lä näp­pä­ryy­del­lä saam­me päät­te­lyn toi­mi­maan en­tis­tä­kin laa­jem­mal­le jou­kol­le ky­sy­myk­siä. En­nen si­tä tu­lee huo­ma­ta, et­tä kah­den edel­li­sen teh­tä­vän ky­sy­myk­sis­tä täs­mäl­leen kak­si on rat­kea­via. Mit­kä ne ovat? Tä­mä ky­sy­mysOn­ko π aj­soym, jo­ka py­säh­tyy ai­na­kin jo­kai­sel­la syöt­teel­lä, jon­ka pi­tuus on enin­tään kak­si ja jos­sa esiin­tyy täs­mäl­leen seit­se­män A-kir­jain­ta? rat­keaa täl­lä ali­oh­jel­mal­laχ(π)
return T
ja tä­mä ky­sy­mysOn­ko π aj­soym, jo­ka py­säh­tyy ai­na­kin jol­la­kin syöt­teel­lä, jon­ka pi­tuus on enin­tään kak­si ja jos­sa esiin­tyy täs­mäl­leen seit­se­män A-kir­jain­ta? rat­keaa täl­lä ali­oh­jel­mal­laχ(π)
return F
.

Siis jo­kai­nen sel­lai­nen ky­sy­mys on rat­kea­va, jon­ka vas­taus kai­kil­le aj­soy­meil­le on ”kyl­lä”. Tä­hän luok­kaan kuu­lu­va ky­sy­mys voi ol­la sil­lä ta­val­la vaa­ti­va, et­tä voi ol­la vai­kea huo­ma­ta, et­tä ky­sy­mys to­del­la­kin kuu­luu tä­hän luok­kaan. Sil­ti jo­kai­sel­le sel­lai­sel­le ky­sy­myk­sel­le on ole­mas­sa hy­vin yk­sin­ker­tai­nen tes­te­ri. Em­me eh­kä tie­dä, et­tä ky­sy­mys kuu­luu sii­hen luok­kaan, ja sik­si em­me tie­dä, et­tä ko. hy­vin yk­sin­ker­tai­nen tes­te­ri on sil­le ky­sy­myk­sel­le pä­te­vä tes­te­ri. Tie­tä­mät­tö­myy­tem­me ei kui­ten­kaan ku­moa si­tä, et­tä se tes­te­ri on ole­mas­sa ja toi­mii oi­kein.

Myös jo­kai­nen sel­lai­nen ky­sy­mys on rat­kea­va, jon­ka vas­taus kai­kil­le aj­soy­meil­le on ”ei”.

Hen­ry Gor­don Ri­ce to­dis­ti väi­tös­kir­jas­saan vuon­na 1951, et­tä nä­mä kak­si luok­kaa ky­sy­myk­siä ovat ai­noat rat­kea­vat ky­sy­myk­set, jot­ka kos­ke­vat nii­den syöt­tei­den jouk­koa, joil­la an­net­tu aj­soym py­säh­tyy. (Esi­mer­kik­si ky­sy­mys ”On­ko an­ne­tun aj­soy­min koo­dis­sa ai­na­kin 100 ri­viä” ei ole täl­lai­nen ky­sy­mys ja rat­keaa hel­pos­ti.)

Lau­se 4 Jo­kai­nen seu­raa­vat eh­dot täyt­tä­vä kyl­lä/ei-ky­sy­mys on rat­kea­ma­ton: se kos­kee nii­den syöt­tei­den jouk­koa, joil­la an­net­tu aj­soym py­säh­tyy, ja on ole­mas­sa se­kä aj­soym jol­le vas­taus on ”kyl­lä” et­tä aj­soym jol­le vas­taus on ”ei”.

To­dis­tus. Ole­tam­me, et­tä ky­sy­myk­sen rat­kai­se­va tes­te­ri τ on ole­mas­sa, ja ra­ken­nam­me sen avul­la py­säh­ty­mis­tes­te­rin. An­nam­me niil­le kah­del­le aj­soy­mil­le, joi­den ole­mas­sa olo lu­vat­tiin lau­sees­sa, ni­met kyllä_ajsoym ja ei_ajsoym.

Ali­oh­jel­mal­le surkea_otspt vas­taus on jo­ko ”kyl­lä” tai ”ei”.

Jos se on ”kyl­lä”, niin χ(π, σ) te­kee ja tes­taa seu­raa­van aj­soy­min:

ξπ, σ(ρ ∈ Σ*) ∈ 𝔹
π(σ)
return ei_ajsoym(ρ)

Jos π(σ) ei py­säh­dy, niin ξπ, σ käyt­täy­tyy näinEi py­säh­dy mil­lään syöt­teel­lä. (Sen syö­te on ρ.) eli sa­mal­la ta­val­la kuin tä­mä ali­oh­jel­masurkea_otspt. Sil­le aj­soy­mil­le tes­te­ri vas­taa näinT, ja sa­man se vas­taa ξπ, σ:lle kos­ka se käyt­täy­tyy sa­moin. Jos π(σ) py­säh­tyy, niin ξπ, σ(ρ):n suo­ri­tus pää­see kut­sun π(σ) lä­pi ja jat­kaa eteen­päin, jo­ten ξπ, σ käyt­täy­tyy sa­mal­la ta­val­la kuin tä­mä ali­oh­jel­maei_ajsoym. Sil­le aj­soy­mil­le tes­te­ri vas­taa näinF, ja sa­man se vas­taa ξπ, σ:lle kos­ka se käyt­täy­tyy sa­moin. Sik­si tä­mä ali­oh­jel­maχ(π, σ)
ξ := ξπ, σ
return ¬ τ(ξ)
on py­säh­ty­mis­tes­te­ri. Huo­ma­sit­han tä­män yk­si­tyis­koh­danτ(ξ) vas­taa T sil­loin kun py­säh­ty­mis­tes­te­ri vas­tai­si F ja päin­vas­toin. Tä­mä kor­jat­tiin ne­gaa­tiol­la ¬.?

Jos surkea_otspt:lle vas­taus on ”ei”, niin χ(π, σ) te­kee ja tes­taa tä­män aj­soy­minξπ, σ(ρ ∈ Σ*) ∈ 𝔹
π(σ)
return kyllä_ajsoym(ρ)
. Siis χ on täl­lai­nenχ(π, σ)
ξ := ξπ, σ
return τ(ξ)
. Päät­te­ly, et­tä χ on py­säh­ty­mis­tes­te­ri, nou­dat­taa jo tu­tuk­si tul­lut­ta kaa­vaa.

Kum­mas­sa­kin ta­pauk­ses­sa, jos τ oli­si ole­mas­sa, niin py­säh­ty­mis­tes­te­ri­kin oli­si ole­mas­sa, vas­toin aiem­min to­dis­tet­tua. Niin­pä τ ei ole ole­mas­sa. To­dis­tuk­sen lop­pu on ta­pa­na mer­ki­tä vii­mei­sen ri­vin oi­keas­sa reu­nas­sa ole­val­la laa­ti­kol­la. Täs­sä se on:

Lo­puk­si

Rat­kea­mat­to­muus­il­miön tut­ki­mis­ta voi jat­kaa mo­neen suun­taan. Ri­cen lau­seen vuok­si mel­kein mi­kä ta­han­sa nii­den syöt­tei­den jouk­koa, joil­la an­net­tu ali­oh­jel­ma py­säh­tyy, kos­ke­va kyl­lä/ei-ky­sy­mys on rat­kea­ma­ton. On myös mo­nia rat­kea­mat­to­mia kyl­lä/ei-ky­sy­myk­siä, jot­ka kos­ke­vat jo­ta­kin muu­ta ai­he­pii­riä kuin ali­oh­jel­mien käyt­täy­ty­mi­nen.

Toi­nen suun­ta läh­tee ha­vain­nos­ta, et­tä jos ky­sy­myk­sen ”py­säh­tyy­kö π tyh­jäl­lä syöt­teel­lä” vas­taus on ”kyl­lä”, on ai­na mah­dol­lis­ta var­mis­tua sii­tä et­tä se on ”kyl­lä” käyn­nis­tä­mäl­lä π ja odot­ta­mal­la tar­peek­si kauan. Vas­tauk­ses­ta ”ei” voi­daan toi­si­naan var­mis­tua. Tie­däm­me esi­mer­kik­si, et­tä surkea_otspt ei py­säh­dy tyh­jäl­lä syöt­teel­lä. Ei kui­ten­kaan ole ole­mas­sa yleis­pä­te­vää kei­noa, jol­la jo­kai­ses­sa ta­pauk­ses­sa, jos­sa vas­taus on ”ei”, voi­daan var­mis­tua sii­tä, et­tä se to­del­la on ”ei”. (Jos oli­si, saa­tai­siin tyh­jän syöt­teen py­säh­ty­mis­tes­te­ri käyn­nis­tä­mäl­lä π:n suo­ri­tus ja ei-kei­no rin­nak­kain, ja odot­ta­mal­la kun­nes jom­pi­kum­pi val­mis­tuu.) On ole­mas­sa kyl­lä/ei-ky­sy­myk­siä, jois­sa kum­mal­le­kaan vas­tauk­sel­le ei ole yleis­pä­te­vää var­mis­tu­mis­kei­noa.

Jos ky­sy­mys muu­te­taan muo­toon py­säh­tyy­kö an­net­tu ali­oh­jel­ma an­ne­tul­la syöt­teel­lä vii­meis­tään an­ne­tun as­kel­mää­rän jäl­keen, se muut­tuu rat­kea­vak­si: ali­oh­jel­maa voi­daan suo­rit­taa kun­nes jo­ko se py­säh­tyy tai an­net­tu as­kel­mää­rä tu­lee täy­teen. Voi­daan to­dis­taa, et­tä ei ole ole­mas­sa yleis­pä­te­vää kei­noa saa­da tä­män ky­sy­myk­sen vas­taus olen­nai­ses­ti no­peam­min kuin täl­lä ta­val­la. Vas­taa­va tu­los pä­tee ky­sy­myk­sel­le py­säh­tyy­kö an­net­tu ali­oh­jel­ma an­ne­tul­la syöt­teel­lä vii­meis­tään käy­tet­tyään an­ne­tun mää­rän muis­tia.

Nä­mä tu­lok­set yh­des­sä py­säh­ty­mis­tes­te­rin ole­mat­to­muu­den kans­sa tar­koit­ta­vat, et­tä ei ole ole­mas­sa olen­nai­ses­ti pa­rem­paa yleis­pä­te­vää kei­noa sel­vit­tää mi­tä ali­oh­jel­ma te­kee kuin ajaa se ja kat­soa mi­tä ta­pah­tuu. Tä­mä on huo­no uu­ti­nen laa­dun­var­mis­tuk­sen kan­nal­ta, kos­ka eri­lai­sia syöt­tei­tä on yleen­sä ai­van liian mon­ta, jot­ta ne kaik­ki voi­tai­siin ko­keil­la.