Simo K. Kivelä, 15.4.2003

Luonnollisten lukujen laskutoimitusten määrittely Peanon aksioomien pohjalta

Aksioomat

Luonnolliset luvut voidaan määritellä Peanon aksioomien avulla. Tarkastelun kohteena on tällöin joukko, jolle annetaan nimi ℕ ja jonka alkioilla oletetaan olevan seuraavat ominaisuudet:

1) Joukossa ℕ on alkio u.
2) Jokaista joukon ℕ alkiota p kohden on olemassa yksikäsitteinen alkio s(p), jota sanotaan alkion p seuraajaksi.
3) Alkio u ei ole minkään alkion seuraaja.
4) Jos s(p) = s(q), niin p = q.
5) Olkoon S on jokin joukon ℕ osajoukko, jolla on ominaisuudet a) u ∈ S, b) jos p ∈ S, niin myös s(p) ∈ S. Tällöin S = ℕ.

Näitä viittä ominaisuutta sanotaan Peanon aksioomiksi ja joukkoa ℕ luonnollisten lukujen joukoksi.

Aksioomien määrittämä jounon ℕ rakenne tulee ymmärrettävämmäksi seuraavasti:

Alkio u saakoon nimekseen '1'. Aksiooman 2 mukaan tällä on seuraaja s(u), joka saakoon nimekseen '2'. Tällä on edelleen seuraaja s(s(u)), jonka nimi olkoon '3'. Näin jatketaan. Kaikkiaan syntyy ketju joukon ℕ alkioita, ts. eräs joukon ℕ osajoukko. Tällä on aksioomassa 5 joukolta S vaaditut ominaisuudet, jolloin siis ketju on sama kuin ℕ. Joukossa ℕ ei siis ole muita alkioita kuin u ja tämän seuraajat: u, s(u), s(s(u)), s(s(s(u))) jne.

Nimien antaminen luvuille

Seuraavassa on tarkoitus määritellä joukon ℕ alkioille yhteen- ja kertolasku. Jotta alkioita voidaan myös käsitellä niiden nimien avulla, määritellään seuraavat Mathematican apufunktiot:

luku[nimi_String] := Nest[s, u, ToExpression[nimi] - 1]

nimi[p_s] := 
      ToString[p /. {s -> Function[x, x + 1], u -> 1}]; 
    nimi[u] := ToString[1]

Näistä edellinen saa argumentikseen luvun nimen ja palauttaa luvun seuraajafunktion s avulla esitettynä. Jälkimmäinen on tämän käänteisfunktio. Esimerkiksi:

luku["7"]

nimi[s[s[s[s[u]]]]]

nimi[luku["12"]]

luku[nimi[s[s[u]]]]

nimi[u]

luku["1"]

Aksioomista seuraa myös, että samalle alkiolle ei tässä anneta kahta eri nimeä: Jos nimet ovat erilaiset, kyseessä on myös kaksi eri alkiota.

Laskutoimitusten määrittely

Luonnollisten lukujen yhteen- ja kertolasku on määriteltävä induktiivisesti, ts. ensin määritellään ne laskutoimitukset, joissa toisena argumenttina on u. Yleinen tapaus palautetaan tämän jälkeen rekursiivisesti edeltäjää koskevaan laskutoimitukseen. Tällöin aksioomasta 5 seuraa, että laskutoimitus tulee määritellyksi kaikille joukon ℕ alkioille.

Laskutoimitus on itse asiassa kahden muuttujan funktio. Esimerkiksi yhteenlasku saa kaksi argumenttia, yhteenlaskettavat, ja funktion arvona on näiden summa. Määriteltävien funktioden nimet olkoot summa ja tulo:

Yhteenlasku:

summa[p_, u] := s[p]
summa[p_, s[q_]] := s[summa[p, q]]

Kertolasku:

tulo[p_, u] := p
tulo[p_, s[n_]] := summa[tulo[p, n], p]

Esimerkkinä olkoon lukujen 7 ja 8 yhteen- ja kertolasku:

Nimien perusteella muodostetut luvut ovat

a = luku["7"]

b = luku["8"]

Näiden summa on

c = summa[a, b]

ja sitä vastaava nimi

nimi[c]

Lukujen tulo on

d = tulo[a, b]

ja tämän luvun nimi

nimi[d]

Erityisesti:

tulo[u, a] // nimi

tulo[a, u] // nimi

Myös monimutkaisempia lausekkeita voidaan laskea:

a = luku["2"]; b = luku["3"]; c = luku["4"]; 
    d = luku["5"];

v1 = summa[tulo[a, summa[b, c]], tulo[d, tulo[a, a]]]

nimi[v1]

Mathematican rakenteessa olevat rajoitukset

Edellä olevalla tavalla määritellyissä laskutoimituksissa on syytä välttää liian suuria lukuja. Määritelmät ovat nimittäin rekursiivisia ja Mathematicalla on rajoitettu rekursioiden syvyys. Rajoitus ilmenee muuttujasta

$RecursionLimit

Esimerkki epäonnistumisesta:

e = luku["260"];

v2 = summa[a, e]

v3 = summa[e, a]

v2 // nimi
v3 // nimi

Esimerkin laskeminen epäonnistuu toisinpäin, mutta onnistuu toisinpäin, koska yhteenlaskun määritelmä ei ole symmetrinen (vaikka määritelmän tuloksena syntyvä yhteenlasku onkin). Rekursiorajaa voidaan muuttaa, minkä jälkeen edellä olevat laskut voi ajaa uudelleen:

$RecursionLimit = 300

Helpomman algebran rakentaminen määritelmien varaan

Funktioiden summa ja tulo kirjoittaminen moneen kertaan laskettavaan lausekkeeseen tekee lausekkeiden syöttämisen hankalaksi. Lukujen neliösumma esimerkiksi olisi

v4 = 
      summa[tulo[a, a], 
        summa[tulo[b, b], summa[tulo[c, c], tulo[d, d]]]]

v4 // nimi

Ottamalla käyttöön laskutoimituksille sopivat symbolit päästään hieman yksinkertaisempaan esitykseen. Symboli ⊕tarkoittaa funktiota nimeltään CirclePlus ja symboli ⊗ funktiota CircleTimes. Kun nämä asetetaan tarkoittamaan edellä määriteltyjä laskutoimituksia, voidaan lausekkeet syöttää niiden avulla:

CirclePlus = summa
CircleTimes = tulo

v5 = 
      a⊗a⊕(b⊗b⊕(c⊗c⊕d⊗d))

v5 // nimi

Syötteestä on voitu jättää sulut pois kertolaskujen ympäriltä, koska Mathematicassa on sisäänrakennettuna operaatioiden suoritusjärjestys: ⊗ suoritetaan ensin, ⊕ sitten. Kaikkia sulkuja sen sijaan ei voida jätää pois, koska funktiota summa ei ole määritelty useammalle kuin kahdelle argumentille; sama koskee funktiota tulo.

v6 = 
      a⊗a⊕b⊗b⊕c⊗c⊕d⊗d

Tilanne voidaan korjata antamalla lisämääritelmät, joissa kolmen tai useamman argumentin summa ja tulo palautetaan kahden argumentin summaksi ja tuloksi. (Yhdellä alaviivalla merkitty symboli tarkoittaa mitä tahansa yhtä argumenttia, kahdella alaviivalla (pitempi alaviiva) merkitty vastaavasti yhtä tai useampaa argumenttia.)

summa[x_, y_, z__] := summa[x, summa[y, z]]
tulo[x_, y_, z__] := tulo[x, tulo[y, z]]

Tämän jälkeen lasku onnistuu ilman sulkuja:

v6 = 
      a⊗a⊕b⊗b⊕c⊗c⊕d⊗d

v6 // nimi

Harjoitustehtäviä

1) Luonnolliset luvut voidaan yhtä hyvin nimetä siten, että alkio u saa nimekseen '0', ts. pienin luonnollinen luku ei olekaan ykkönen vaan nolla. Tämä heijastuu kuitenkin laskutoimitusten määrittelyyn. Muunna määritelmät siten, että ne vastaavat tätä tilannetta.

2) Luonnollisille luvuille voidaan eräissä tapauksissa määritellä vähennyslasku: suuremmasta luvusta voidaan vähentää pienempi, mutta ei pienemmästä suurempaa eikä yhtä suuria lukuja toisistaan (jos käytössä on määritelmä, missä pienin luonnollinen luku on ykkönen). Määrittele vähennyslasku rekursiivisesti seuraajaesityksiin perustuen. Huomaa, että Mathematican aritmeettisia operaatioita ei saa käyttää, vaan määritelmän on perustuttava yksinomaan seuraajaesityksiin. Jos annettujen lukujen erotus ei ole määritelty, tulee tästä antaa ilmoitus.

3) Täydennä edellä kehitettyä notaatiota (⊕, ⊗) potenssiinkorotussymbolilla valitsemalla tähän tarkoitukseen sopivan laskujärjestyksen antama symboli ja testaa määrittelysi toimivuus. (Ks. Mathematican dokumentaatiota:  Operator input forms, in order of decreasing precedence, pitkä taulukko, vaikkapa Wedge.)