Matematická indukce a správnost programů doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky FIT České vysoké učení technické v Praze c Josef Kolar, 2011 Základy diskrétní matematiky, BI-ZDM ZS 2011/12, Lekce 13 Evropský sociální fond. Praha& EU: Investujeme do vaší budoucnosti doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 1/ 16
Neformální hierarchie správnosti Co je to správný program? 1 Program neobsahuje syntaktické chyby(přeloží se). 2 Program neobsahuje syntaktické chyby ani neplatné operace zjistitelné při výpočtu(přeloží a spustí se). 3 Program spočítá pro nějaká testovací vstupní data správné výsledky. 4 Program spočítá pro typické sady testovacích vstupních dat správné výsledky. 5 Program spočítá pro všechny sady testovacích vstupních dat správné výsledky. 6 Program spočítá správné výsledky pro všechna validní vstupní data, která odpovídají specifikaci. 7 Pro všechna validní vstupní data a pro všechna očekávatelná chybná vstupní data program dodá správnou(nebo přijatelnou) odpověď. doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 2/ 16
Správnost programu Proč chceme mít správné programy? Intuitivně chápeme, že správný program dělá přesně to(a jenom to), co seodnějočekává-nicvíc,nicmíň! Formálně správný(korektní) je takový program, jehož správnost byla matematicky dokázána(verifikována). To vyžaduje jazyk na specifikaci toho, co má program dělat. Specifikační jazyky vycházejí z matematické logiky. Axiomatickásémantika-C.A.R.Hoare1969-prostředekpro specifikaci sémantiky a verifikaci programu. Sir Charles Antony Richard Hoare (* 11. ledna 1934 Colombo), britský informatik, autor řadicího algoritmu Quicksort. Vedl výzkumnou skupinu v Oxford University Computing Laboratory, nyní profesor emeritus Microsoft Research, Cambridge. doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 3/ 16
Formální správnost programu Verifikace programudonedávna spíše akademická záležitost nyní podstatná součást critical software systems high-reliability, safety-critical, mission-critical, life-critical,... Dokazuje se tzv. totální korektnost: program dělá to, co má(parciální korektnost) program zaručeně skončí V čem spočívá parciální korektnost? Program implementuje svoji specifikaci. Verifikace se nedělá(jen) ručně - využívají se dokazovací systémy modelovací jazyky(např. UML) specifikační jazyky podpora v programovacích jazycích doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 4/ 16
Axiomatická sémantika Axiomatická sémantika je prosředek, který slouží ke specifikaci požadavku na program(co má program dělat). Základní myšlenka je použití tzv. tvrzení(assertions) tvrzení je formule predikátové logiky, která popisuje stav programu v určitém okamžiku jeho výpočtu postcondition- tvrzení(podmínka) platné pro výsledek precondition- tvrzení(podmínka) platné před započetím výpočtu tvrzení se používají i na jednotlivé konstrukce, které tvoří program Hoare-ovatrojicemátvar {P} S {Q}: precondition- statement(nebo program)- postcondition. doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 5/ 16
Příklad {true} int Max (int a, int b) { int m; if (a >= b) m = a; else m = b; fi return m; precondition P nemáme žádné specifické omezení na vstupy tělo programu S } {m = max(a,b)} postcondition Q max je matematický pojem doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 6/ 16
Verifikační systém Verifikační systém zahrnuje dvě složky Axiomy:popisujíefektspecifickýchjazykovýchkonstrukcí(příkazů) Odvozovacípravidla:určujípřípustnoustrukturudůkazů(inferencí) Příklad pravidla pro sekvenci {P}S 1 {Q}, {Q}S 2 {R} {P}S 1 ;S 2 {R} Příklad- uvažujeme dva příkazy v sekvenci {sude(x+1)} x=x+1; {sude(x)} {sude(x)} a=x; {sude(a)} Jaký je celkový efekt těchto dvou příkazů {sude(x+1)} x=x+1;a=x; {sude(a)} doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 7/ 16
Invarianta cyklu Pravidlo pro cyklus {test R} s {R}, test R Q {R}while(test)do sod {Q} Tvrzení Rsenazýváinvariantacyklu-musíbýtplatnépředipokaždém jeho provedení. Např. pro cyklus {R}while(i < n)do i=i+1;f= f i;od {f= n!} je možné zvolit invariantu R ve tvaru R (1 i) (i n) (f= i!) Ažkoncovýtest(i < n)nabydehodnoty false,jedináhodnota i,pro kteroujeinvariantacyklu Rsplněna,je i=n,cožodůvodňujezávěr {f = n!} v postcondition. doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 8/ 16
Příklad programu- iterativní SelectionSort void SelectionSort(int A[], int n) { int i, j, small, temp; (1) for (i = 0; i < n-1; i++) { /* nastav small na index prvniho vyskytu */ /* nejmensiho ze zbyvajicich prvku */ (2) small = i; (3) for (j = i+1; j < n; j++) (4) if (A[j] < A[small]) (5) small = j; /* zde je small roven indexu prvniho */ /* vyskytu nejmensiho prvku a A[i..n-1], */ /* tak vzajemne zamenime A[small] a A[i] */ (6) temp = A[small]; (7) A[small] = a[i]; (8) A[i] = temp; } } doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 9/ 16
Vytvoření invariantu vnitřního cyklu Zkusíme formulovat invariantu vnitřního cyklu v SelectionSort(smyslem cyklujenaléztindexnejmenšíhoprvkuvčástipole A[i.. n 1]): (2) small = i; (3) for (j = i+1; /* */ j < n; j++) (4) if (A[j] < A[small]) (5) small = j; Invarianta musí platit v místě vyznačeném komentářem, označme ji S(k): připrvnímprůchodumáproměnná jhodnotu i+1asmallmáhodnotu i přidruhémprůchodumá jhodnotu i+2,protožesejednouinkrementovala smallmádíkytělucyklu(4)a(5)hodnotubuď inebo i+1podletoho, kteréza[i]aa[i+1]jemenší podobněvetřetímprůchoduje jrovno i+3asmalljeindexnejmenšíhoz A[i.. i+2] doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 10/ 16
Důkaz invarianty vnitřního cyklu Tvrzení S(k) Pokudvokamžiku,kdysevýpočetdostanektestu(j < n)uvnitř for-cyklunařádku(3),mářídícíproměnnácyklu jhodnotu k,pak hodnotouproměnné smalljejeindexnejmenšíhoprvkuza[i.. k 1]. Toto tvrzení budeme dokazovat indukcí. 1 Základníkrok:začínámeshodnotami k= i+1asmall=ia tvrzení S(i+1)říká,že smallmámítzahodnotuindexnejmenšího prvkuza[i.. i],cožzjevněplatí. 2 Indukčníkrok:Předpokládámeplatnost S(k)pro k i+1a dokazujemeplatnost S(k+1).Musíbýt(k < n) (jinakbyužcykl dříve skončil), takže výpočet se k testu konce cyklu dostane s hodnotou jrovnou k+1. Cosestanovtělecyklupoté,co jmělohodnotu k? doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 11/ 16
Důkaz invarianty vnitřního cyklu- dokončení (2) small = i; (3) for (j = i+1; /* */ j < n; j++) (4) if (A[j] < A[small]) (5) small = j; Záležínatom,jakdopadltestvpříkazuifnařádku(4): není-li A[k] menšínežlinejmenšíza[i.. k 1],paksehodnota small neměníabudetímpádemtakéindexemnejmenšíhodnotyza[i.. k] tedy S(k+1)platí je-li A[k] menšínežlinejmenšíza[i.. k 1],paksehodnota smallnastaví na k,takžebudezaseindexemnejmenšíhodnotyza[i.. k] tedy S(k+1) opět platí. S(k)jetedydokázánoprohodnoty k i+1. Cyklsealeukončí,když jmáhodnotu n,cožznamenáplatnost S(n),tedyže smalljeindexnejmenšíhoza[i.. n 1] tosehodíproverifikacicelého programu. doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 12/ 16
Invarianta vnějšího cyklu Invarianta T(m)prohodnotuproměnné irovnou mvefor-cyklu(1): (1) for (i = 0; i < n-1; i++) { (2) small = i; (3) for (j = i+1; j < n; j++) (4) if (A[j] < A[small]) (5) small = j; (6) temp = A[small]; (7) A[small] = a[i]; (8) A[i] = temp; } Tvrzení T(m) Pokudvokamžiku,kdysevýpočetdostanektestu i < n 1uvnitřfor-cykluna řádku(1),mářídícíproměnnácyklu ihodnotu m,pak 1 A[0.. m 1]jsouseřazené,tj. A[0] A[1]... A[m 1] 2 všechnyprvkyza[m.. n 1]jsouaspoňtakvelkéjakojakýkolivprvekz A[0.. m 1] doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 13/ 16
Požadavky a příprava ke zkoušce Orientační reference pro přípravu(vedle EDUX handouts přednášek a cvičení): 1 Big-O-Habala4b 2 Množiny a zobrazení- Habala 2a,b,c(pozor- opačná notace skládání) 3 Indukce-Habala3a,b 4 Relace-Habala5a,b 5 Ekvivalence a uspořádání- Habala 6a,b 6 Kombinatorika- Habala 10a,b,c,d 7 Rekurence- Habala 9a,b,c Způsob čtení Habalova textu: Tvrzení/fakta/věty vnímat, důkazy číst jen pro vlastní potěchu, příklady řešit. doc. Josef Kolář (FIT ČVUT) Matematická indukce a správnost programů ZDM, ZS 2011/12, Lekce 13 14/ 16