Defineerida algoritmi
olek
(näit. kõigi algoritmis esinevate muutujate hetkeväärtuste
korteež, peaks lubama ka väärtust "väärtustamata").
Tingimus - väide oleku
kohta (tõene/väär).
Tingimuste kombineerimiseks
loogikatehted:
eitus (!), disjunktsioon (||), konjunktsioon (&&),
implikatsioon (=>), ...
Eeltingimus - väide oleku
kohta enne algoritmi täitmise algust.
Järeltingimus - väide
oleku kohta peale algoritmi täitmise lõppu.
Paar (eeltingimus, järeltingimus) on antud algoritmi (välimine)
spetsifikatsioon.
Vt.
pilt
Täieliku korrektsuse teoreem:
Kui algoritmi täitmist alustatakse olekus, mis rahuldab
eeltingimust, siis algoritmi täitmine lõpeb lõpliku aja jooksul
nii, et saavutatud olek rahuldab järeltingimust.
Algoritm on
(täielikult)
korrektne etteantud spetsifikatsiooni suhtes, kui saab
tõestada (täieliku) korrektsuse teoreemi.
Korrektsuse tõestamiseks spetsifikatsiooni (P, Q) suhtes nõrgima
eeltingimuse Wp abil konstrueeritakse antud järeltingimusest Q ja
algoritmist lähtudes niisugune eeltingimus
Wp, mis on järeldatav (igast) antud
eeltingimusest P - seda nim.
nõrgimaks eeltingimuseks:
P => Wp && paari (Wp, Q) jaoks kehtib täieliku
korrektsuse teoreem.
Nõrgima eeltingimuse leidmiseks kasutatakse algoritmi struktuuri -
iga konstruktsiooni jaoks algoritmis on teatud
tuletusreegel.
Tühi algoritm: olek ei
muutu, nõrgimaks eeltingimuseks on järeltingimus ise: Wp = Q
Superpositsioon (kahe
algoritmi järjestikune rakendamine): kui esimese algoritmi
järeltingimus on teise algoritmi nõrgimaks eeltingimuseks, siis
esimese algoritmi nõrgim eeltingimus on superpositsiooni nõrgimaks
eeltingimuseks.
Omistamine x := e : nõrgim
eeltingimus saadakse, kui omistamislause järeltingimuses Q
asendada kõik muutuja x esinemised avaldisega e (ning eeldada, et
e arvutamine toimub kõrvalefektideta).
if-lause:
konstruktsiooni
if
(t) A1 else A2; nõrgim eeltingimus konstrueeritakse
algoritmide
A1 ja
A2 nõrgimatest
eeltingimustest Wp1 ja Wp2 eeldusel, et mõlemal harul on sama
lõpptingimus Q ning tingimuse t kontrollimine on kõrvalefektideta:
t && Wp1 || !t
&& Wp2
Tsüklite korral toome sisse veel
osalise
korrektsuse mõiste: kui algoritmi täitmist alustatakse
olekus, mis rahuldab eeltingimust, siis algoritmi täitmine lõpeb
nii, et saavutatud olek rahuldab järeltingimust või ei lõpe
täitmine üldse.
Lõplikkuse teoreem: kui
algoritmi täitmist alustatakse olekus, mis rahuldab eeltingimust,
siis algoritm lõpetab töö lõpliku hulga operatsioonide täitmise
järel.
Täielik korrektsus = osaline korrektsus + lõplikkus
Tsükli invariant:
tingimus, mis kehtib enne iga tsüklisammu algust.
while-tsükkel:
konstruktsiooni
while(t) A;
nõrgima eeltingimuse konstrueerimiseks kasutatakse
tsükliinvarianti R (eeldame taas, et jätkamistingimuse t
kontrollimine on kõrvalefektideta):
invariantsus: tsükli samm A on osaliselt korrektne (t && R
, R) suhtes.
sihipärasus: !t && R => Q, kus Q on tsükli
järeltingimus.
invariandi kehtivus algoleku jaoks: P => R, kus P on tsükli
eeltingimus.
Tsükli täieliku korrektsuse tõestamiseks tuleb lisaks tõestada
lõplikkuse teoreem.
Selline programmeerimiskeel võimaldab väljendada kõiki Turingi
mõttes arvutatavaid funktsioone.
Näide: Kasutame
FPP programmitõestamise tarkvara aadressilt
http://psc.informatik.uni-jena.de/fpp/fpp-main.htm
FPP (Frege Program Prover) University of Jena, Germany