Lyhyt MathCheck-ohje (uuteen välilehteen)
Taulukko A[1…n] on kasvavassa suuruusjärjestyksessä. Oheisen algoritmin tehtävänä on löytää siitä kaksi alkiota, joiden summa on x.
1 a := 1
2 y := n
3 while a < y && A[a] + A[ y] ≠ x do
4 if A[a] + A[ y] < x
5 then a := a + 1
6 else y := y − 1
Huomaatko, että vaatimusmäärittelymme on hieman epätarkka? Esimerkki syötteestä, jolla etsityt alkiot ovat toisen tulkinnan mukaan olemassa ja toisen tulkinnan mukaan eivät ole, löytyy tästäA = [1, 3, 4] ja x = 6. Vaatimusmäärittely on epätarkka sikäli, että …Tällaisissa tilanteissa ei aina ole selvää, saavatko mainitut kaksi alkiota olla sama alkio. Kun sanotaan ”kahden parittoman luvun summa on aina parillinen”, niin ne luvut saavat olla sama luku. Jos pyydät minua mainitsemaan kaksi eläintä, niin varmaankin hyväksyt vastaukseksi ”koira ja kissa” mutta et hyväksy ”koira ja koira”.
Kirjoita seuraavat väitteet.
Käytämme jatkossa tulkintaa ”kaksi eri alkiota, jotka saavat olla yhtäsuuret”.
Silmukan oikeaksi todistamisessa käytetään usein viisikohtaista menetelmää:
Laita tähän pikkulaatikkoon ruksi ja kokeile edellisen kysymyksen napeilla, kelpaako edellisen kysymyksen vastauksesi yhä. Jos ei kelpaa, niin syynä on melko varmasti se, että vastauksesi ei päde eräässä erikoistapauksessa, joka on taulukoille mahdollinen, mutta joka jää helposti huomaamatta tämänkaltaisessa tilanteessa. Se erikoistapaus on …tyhjä taulukko eli n = 0.
Algoritmi lopettaa varmasti, koska …Jokaisella kierroksella y − a pienenee yhdellä, koska joko a kasvaa yhdellä ilman että y muuttuu, tai y vähenee yhdellä ilman että a muuttuu. Algoritmi lopettaa viimeistään kun y − a = 0.
Tämä a:ta ja y:tä koskeva väite takaa myös, että (olettaen, että lukualue ei lopu kesken) algoritmi ei koskaan suorita mitään laitonta. Miten se sen tekee? …Se takaa, että taulukon A indeksit ovat aina laillisia. Muuta potentiaalisesti laitonta algoritmi ei tee (olettaen, että lukualue ei lopu kesken).
Alamme nyt tutkia, miksi algoritmi löytää mitä pitääkin. Algoritmin suunnittelija lienee tarkoittanut, että jokainen ehdot täyttävä alkiopari sijaitsee välillä a, …, y. Tarkastamme, onko tämä ominaisuus invariantti.
Kun silmukkaan tullaan sen edeltä, väite on triviaalisti totta, koska …Silloin väli a, …, y kattaa koko taulukon. Invariantilta vaadittu ominaisuus 2 siis toteutuu.
Ominaisuuden 5 todistamiseksi on osoitettava, että silmukan lopetettua joko A[a] ja A[ y] muodostavat ehdot täyttävän alkioparin tai sellaista ei ole olemassa, ja että valinta näiden kahden väliltä määräytyy siitä, päteekö a < y. Jos silmukan lopetettua a < y, niin algoritmi lopetti siksi, että …A[a] + A[ y] = x Jos silmukan lopetettua ¬(a < y), niin …Välin a, …, y pituus on enintään 1, joten väliin ei mahdu kahta eri alkiota. Siksi ehdot täyttävää alkioparia ei ole olemassa.
Jäljellä on ominaisuus 3. Silmukan vartalossa joko a kasvaa tai y vähenee, eikä siinä tapahdu mitään muuta. On osoitettava, että tämä ei voi poistaa invarianttia voimasta.
Niinpä A[a] ei voi muodostaa ehdot täyttävää paria minkään alkion kanssa. Siksi a:n voi jättää pois etsintäalueelta.
Ominaisuuden 3 ja samalla koko algoritmin todistus on valmis.