Sunteți pe pagina 1din 11

Vericarea programelor

17 octombrie 2011

S a relu am un exemplu

// assume(n>2); void partition(int a[], int n) { int pivot = a[0]; int lo = 1, hi = n-1; while (lo <= hi) { while (lo < n && a[lo] <= pivot) lo++; while (a[hi] > pivot) hi--; if (lo < hi) swap(a,lo,hi); } }

Cum putem rat iona despre acest (fragment de) program ?

Inceputurile veric arii programelor

Scopul: formalizarea semanticii limbajelor de programare Robert W. Floyd. Assigning Meanings to Programs (1967) an adequate basis for formal denitions of the meanings of programs [...] in such a way that a rigorous standard is established for proofs If the initial values of the program variables satisfy the relation R1 , the nal values on completion will satisfy the relation R2 .

Floyd: Assigning Meanings to Programs


Metoda: anotarea unui program (schem a logic a) cu asert iuni verication condition: o formul a Vc (P ; Q ) a. . dac a P e adev arat nainte de a executa c , atunci Q e adev arat la ie sire. strongest veriable consequent (pt. un program + o condit ie init ial a) = cea mai puternic a proprietate valabil a dup a execut ia programului Formulele/asert iunile: exprimate n logica predicatelor de ordinul I Lucrarea lui Floyd: dezvolt a reguli generale pt. combinarea condit iilor de vericare si reguli specice pentru diferitele tipuri de instruct iuni introduce invariant ii pentru rat ionamentele despre cicluri trateaz a terminarea folosind o m asur a pozitiv a descresc atoare

Lucr arile lui Hoare


C.A.R. Hoare. An Axiomatic Basis for Computer Programming (1969) ca si Floyd, trateaz a precondit ii si postcondit ii pentru execut ia unei instruct iuni, dar notat ia de triplet Hoare pune mai clar n evident a relat ia dintre instruct iune si cele dou a asert iuni lucreaz a cu programe textuale, nu scheme logice Notat ie: corectitudine part ial a {P } S {Q } Dac a S e executat ntr-o stare care satisface P , si execut ia lui S se termin a, starea rezultant a satisface Q Ulterior: rat ionamente similare pt. corectitudine total a [P ] S [Q ] Dac a S e executat ntr-o stare care satisface P , atunci execut ia lui S se termin a, si starea rezultant a satisface Q Aplicat ie riguroas a: C.A.R. Hoare. Proof of a Program: FIND (1971)

Axiomele (regulile) lui Hoare

sunt denite pentru ecare tip de instruct iune n parte; prin combinat ia lor, se poate rat iona despre programe ntregi Atribuire: {Q [x /E ]} x := E {Q }
unde Q [x /E ] e substitut ia lui x cu E n Q

Ex: {x = y 2} x := x + 2 {x = y } ( n rezultat, x = y , substituim x cu expresia atribuit a, x + 2 si obt inem x + 2 = y , deci x = y 2) Obs: scrierea napoi a regulii (P n funct ie de Q ) simplic a exprimarea Secvent iere: Decizie: {P } S1 {Q } {Q } S2 {R } {P } S1 ; S2 {R } {P E } S1 {Q } {P E } S2 {Q } {P } if E then S1 else S2 {Q }

Regulile lui Hoare (cont.)


Ciclul cu test (init ial): cheia n rat ionamentul despre programe trebuie g asit un invariant I = o proprietate ment inut a adev arat a de ecare execut ie a ciclului (exprimat a n punctul dintre iterat ii) dac a intr am n ciclu (E ), invariantul e ment inut dup a o iterat ie S dac a nu mai intr am (E ), invariantul implic a concluzia Q {I E } S {I } I E Q {I } while E do S {Q } while (lo < hi) { // m = (lo + hi) / 2; if (n > m) // lo = m+1; // else hi = m; // } // n = lo; // lo<=n c autare binar a; I: lo <= n && n <= hi

ambele cazuri ment in lo<=n && n<=hi n > m => n >= m+1 => n >= lo !(n > m) => n <= m => n <= hi I r am^ ane adev arat && n<=hi && !(lo<hi) => lo==n && n==hi

Regulile lui Hoare n prezent a pointerilor


S a stabilim {P } x = 2 {v + x = 4} Care este precondit ia P ? R aspunsul corect: v = 2 x = &v . Dar aplicarea regulii (v + x = 4)[x /2] pierde cazul al doilea. Trebuie s a model am memoria. m = memorie, a = adres a, d = dat a. Fie funct iile rd (m, a) return d si wr (m, a, d ) return m d dac a a2 = a1 Avem regula: rd (wr (m, a1 , d ), a2 ) = rd (m, a2 ) dac a a2 = a1 Trebuie s a deducem o proprietate a memoriei m din relat ia: rd (wr (m, x , 2), &v ) + rd (wr (m, x , 2), x ) = 4 rd (wr (m, x , 2), &v ) + 2 = 4 rd (wr (m, x , 2), &v ) = 2 x = &v 2 = 2 x = &v rd (m, &v ) = 2 x = &v v = 2

Operatorul weakest precondition al lui Dijkstra

E.W. Dijkstra. Guarded Commands, Nondeterminacy and Formal Derivation of Programs (1975) pentru o instruct iune S si postcondit ie dat a Q pot exista mai multe precondit ii P astfel nc at {P } S {Q } sau [P ] S [Q ]. Dijkstra calculeaz a o precondit ie necesar a si sucient a wp (S , Q ) pentru terminarea cu succes a lui S cu postcondit ia Q . necesar a (weakest): dac a [P ] S [Q ] atunci P wp (S , Q ) wp e un transformator de predicate (transform a post- n precondit ie) permite denirea unui calcul cu astfel de transform ari

Precondit iile lui Dijkstra (cont.)


Atribuire: wp (x := E , Q ) = Q [x /E ] (v. regula lui Hoare) Secvent iere: wp (S1 ; S2 , Q ) = wp (S1 , wp (S2 , Q )) Condit ional: wp (if E then S1 else S2 , Q ) = (E wp (S1 , Q )) (E wp (S2 , Q )) Pentru iterat ie e nevoie de un calcul recursiv. Denim wpk , n ipoteza c a bucla se termin a n cel mult k iterat ii: wp0 (while E do S , Q ) = E Q (nu se intr a n ciclu) wpk +1 (while E do S , Q )) = (E wp (S , wpk (while E do S , Q ))) (E Q) ( k + 1 iterat ii o iterat ie urmat a de k , sau 0 iterat ii; echivalent cu descompunerea primului while n if) se poate scrie ca formul a de punct x

Recapitulare: vericarea prin demonstrare de teoreme

1. Se scriu triplete Hoare / precondit ii Dijkstra 2. Se veric a nl ant uirea lor (cu un demonstrator de teoreme / procedur a de decizie). Exemple: cu regula lui Hoare pentru secvent iere se veric a Pre wp (Prog , Post ) se veric a I E wp (CorpCiclu , I ) pentru cicluri