Floydova Metoda

Download Report

Transcript Floydova Metoda

Floydova Metóda
Na Začiatok
Pri dokazovaní správnosti programov je
potrebné mať špecifikované :
a) programovací jazyk, v ktorom sú
programy písané
b) špecifikačný jazyk na vyjadrenie
vstupnej a výstupnej podmienky a ďalších
vzťahov, ktoré platia medzi hodnotami
premenných počas behu programu
Na Začiatok - definície
x - vstupný vektor, ktorý nadobúda vstupné hodnoty a počas výpočtu sa
nemení
y - vektor programu, obsahuje medzivýsledky
z - výstupný vektor, v ktorom sú uložené výstupné hodnoty v okamihu
ukončenia výpočtu.
P(x) - predikát vyjadrujúci vstupnú podmienku (popisuje vlastnosti prvkov
použitých ako vstupné hodnoty programu)
Q(x, z) - predikát vyjadrujúci výstupnú podmienku (popisuje vzťah hodnôt
výstupných prvkov k vstupným v okamihu ukončenia programu)
¶ - program v nejakom programovacom jazyku
Program končí ak program ¶ skončí výpočet pre všetky údaje spĺňajúce
P(x).
Program je čiastočne správny ak pre všetky údaje splňujúce P(x) pre
ktoré zastaví svoj výpočet dá výsledky splňujúce predikát Q(x, z).
Na Začiatok - definície
Program je správny ak je čiastočne správny a skončí, tj ak pre všetky
údaje splňujúce P(x) skončí a dá výsledky splňujúce predikát Q(x, z).
Verifikovať program vzhľadom na vstupný predikát P(x) a výstupný
predikát Q(y, z) znamená dokázať, že program je správny vzhľadom
na predikáty P(x) a Q(x, z)
Z takéhoto rozdelenia programu vyplýva, že dôkaz správnosti
programu bude mnohokrát rozdelený na dve časti :
1.)či je program čiastočne správny
2.)či program zastaví
Opodstatnenosť verifikačných metód - Riceova Veta : Ani pre
jednoduché špecifikačné a programovacie jazyky neexistuje
algoritmus, ktorý by dokázal zistiť, či je správny vzhľadom na dané
špecifikácie.
Jazyk vývojových diagramov
5 druhov príkazov :
Štartovací
Štart
y:= f(x)
Priraďovací
y:=g(x,y)
Testovací
+
t(x,y)
-
(g je funkcia g:Dx*Dy -> Dy)
(f je funkcia f:Dx -> Dy)
(t je predikát nad Dx*Dy
Jazyk vývojových diagramov
Cieľový príkaz
Spojovací príkaz
z:=h(x,y)
Stop
Programom v jazyku vývojových diagramov budeme nazývať
orientovaný graf vytvorený spojením týchto príkazov pomocou
orientovaných hrán tak, že štart a stop sú použité práve raz a každý
testovací a priraďovací príkaz sú na aspoň jednej ceste medzi nimy.
Jazyk vývojových diagramov
Cyklus je súvislý konečný podgraf programu, v ktorom z každého
vrcholu jediná hrana vychádza a do každého vrcholu jediná hrana
vchádza.
Cesta programom je postupnosť príkazov začínajúca vstupným a
končiaca výstupným príkazom, na ktorej každý príkaz ¶1 je
nasledovaný takým príkazom ¶2, ktorý je spojený s príkazom ¶1
orientovanou hranou, ktorá vedie z ¶1 do ¶2. Úsek cesty programom
budeme nazývať parciálna cesta.
Je zrejmé, že medzi premennými v programe platia určité vzťahy pred
každým príkazom a aj po jeho vykonaní. Tieto vzťahy vyjadrujeme vo
forme tvrdení. Tvrdenie pred príkazom nazývame predpoklad, tvrdenie
po príkaze dôsledok. Tieto tvrdenia budeme vyjadrovať pomocou
predikátu R(x, y) a funkcie r(x,y) : Dx * Dy -> Dy.
Jazyk vývojových diagramov
Napríklad:
…R(x,y) && y3 < y1
…r(x, y1, y2, y3 + 1, y4)
+
y3:=y3+1
y3 < y1
…r(x, y1, y2, y3 , y4)
…R(x,y)
Predikát R(x,y) je možné vytvoriť na základe predikátov, ktoré sa vyskytli na danej
parciálnej ceste programu a funkcia r(x,y) musí vyjadrovať zmeny obsahov
premenných, ktoré boli vykonané v priraďovacích príkazoch.
Jazyk vývojových diagramov
Segmenty programov bez cyklov je možné
jednoducho popísať pomocou takýchto
semantických pravidiel. Čo s cyklami?
V priebehu dôkazu je potrebné rozčleniť
program na elementárne segmenty bez
cyklov a dôkazy urobiť pre tieto segmenty.
Floydova Metóda
Floyd navrhol robiť dôkaz čiastočnej správnosti programu, ktorý je napísaný v
jazyku vývojových diagramov v týchto troch krokoch :
1. krok : Voľba deliacich bodov programu
2. krok : Priradenie induktívnych podmienok deliacim bodom
3. krok : Vytvorenie verifikačných podmienok k verifikačným cestám
Voľba deliacich bodov
programu
Deliace body su volené podľa
nasledovných podmienok :
a) Počiatočný a koncový bod sú deliacimi
bodmi
b) Každý cyklus programu obsahuje aspoň
jeden deliaci bod.
Priradenie induktívnych
podmienok deliacim bodom
Induktívna podmienka je predikát charakterizujúci vzťah medzi hodnotami
premenných v tomto bode. Pritom :
a) Počiatočnému bodu je priradená vstupná podmienka P(x)
b) Koncovému bodu je priradená výstupná podmienka Q(x,y)
c) Deliacemu bodu X je priradená induktívna podmienka Px(x,y),
ktorá je splnená vždy keď sa výpočet dostane do bodu X.
Táto časť dôkazu nie je algoritmizovateľná, odráža myšlienku/podstatu
dokazovaného programu/algoritmu.
Vytvorenie verifikačných
podmienok k verifikačným
cestám
Zvolené deliace body rozdeľujú program na niekoľko úsekov, z ktorých každý
predstavuje cestu. Verifikačná cesta je potom cesta, ktorá začína aj končí
nejakými deliacimi bodmi, medzi ktorými žiadny deliaci bod neleží. Každá
verifikačná cesta je konečná, pretože každý cyklus obsahuje deliaci bod.
Pretože program má konečný počet príkazov, aj počet verifikačných ciest je
konečný.
Ku každej verifikačnej ceste je potom vytvorená verifikačná podmienka, a je
treba dokázať, že všetky verifikačné podmienky sú pravdivé.
Verifikačná podmienka pre cestu α z bodu X do bodu Y má tvar :
Pre všetky x, y [Px(x,y) && Rα(x,y)
Py(x,rα(x,y))] , kde Rα(x,y) je
predikát, ktorý zaručuje, že výpočet z bodu X do bodu Y bude riadený po
verifikačnej ceste α.