130 likes | 329 Views
Floydova Met óda. Na Začiatok. Pri dokazovaní správnosti programov je potrebné mať špecifikované : a) programovac í jazyk, v ktorom sú programy písané
E N D
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í Priraďovací Štart Testovací + - y:=g(x,y) y:= f(x) 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 < y1 y3:=y3+1 …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 hodnotamipremenných v tomto bode. Pritom : • Počiatočnému bodu je priradená vstupná podmienka P(x) • Koncovému bodu je priradená výstupná podmienka Q(x,y) • 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 α.