Você está na página 1de 7

Notas das Aulas Tericas o Correco de Algoritmos ca

Mtodos de Programao II e ca (5304O4 e 7004N6) Ano Lectivo de 20042005


Uma forma de escrever uma especicao de um programa atravs de dois predicados: ca e e a pr-condio que estabelece as condies em que o programa deve funcionar; e ca co a ps-condio que estabelece aquilo que deve acontecer aps a execuo do programa. o ca o ca Dizemos ento que, um dado programa S satisfaz uma especicao (P, Q) (em que P a pra ca e e condio e Q a ps-condio) quando, assumindo que P verdadeiro, podemos garantir que ca o ca e o programa S termina e que, aps a concluso de S, Q verdadeiro. o a e E costume escrever { P } S { Q } para dizer que S satisfaz a especicao (P, Q). ca Desta denio de satisfao resultam imediatamente duas regras ca ca Fortalecimento da pr-condio e ca RP {P } S {Q} (Fort)

{R} S {Q} Enfraquecimento da ps-condio o ca {P } S {Q} QR

{P } S {R}

(Enfraq)

Note-se que dizer que A B corresponde a dizer que A mais restritivo (ou mais forte) do que e B. Da que estas regras se possam ler como: Se um programa funciona em determinadas condies iniciais, ele continuar a funcionar co a se em condies mais restritas. co Se um programa garante que alguma propriedade vlida, garantir que qualquer condio e a a ca menos restritiva tambm vlida. e e a A instruo fundamental de qualquer linguagem imperativa a atribuio. Em C, escreve-se x ca e ca = E para signicar que atribuimos ` varivel x o valor da expresso E. Este signicado traduzido a a a e pela seguinte regra. Atribuio1 ca (Atrib1)

{ P [x \ E] } x = E { P } 1

Em que E[x \ F ] corresponde a, na expresso E, substituir todas as ocorrncias de x pela exa e presso E. a ` A expresso P [x \ E] costume chamar a pr-condio mais fraca (weakest pre-condition) a e e ca que garante que P vlido aps a execuo da atribuio x = E e a o ca ca A conjuno desta regra com a do fortalecimento da pr-condio permite-nos descrever o sigca e ca nicado de uma atribuio de outra forma: ca Atribuio2 ca P (Q[x \ E]) {P } x = E {Q} (Atrib2)

Esta regra operacionalmente mais util do que a anterior pois d-nos um meio directo de provar e a que uma dada atribuio satisfaz uma particular especicao: para provar que { P } x = E { Q } ca ca basta mostrar que P (Q[x \ E]). A correco da composio sequencial de dois programas feita atravs da descoberta de um ca ca e e predicado intermdio que actua como ps-condio do primeiro e pr-condio do segundo. Sob e o ca e ca a forma de uma regra podemos escrever Sequncia e { P } S1 { R } { R } S2 { Q } (;)

{ P } S1 ; S2 { Q }

Exemplo 1
Para provarmos que o programa x = x + y ; y = x - y ; x = x - y faz a troca dos valores das variveis x e y, vamos usar os seguintes predicados a pr-condio: x = x0 y = y0 e ca ps-condio: x = y0 y = x0 o ca A aplicao da regra da sequenciao conduz-nos a descobrir predicados A1 e A2 tais que ca ca so vlidos os seguintes: a a { x = x0 y = y0 } x = x + y { A1 } { A1 } y = x - y { A2 } { A2 } x = x - y { x = y0 y = x0 } Uma estratgia para descobrir estes predicados usar a regra da atribuio (Atrib1) para e e ca em primeiro lugar determinar A2 e depois A1 . 1. Basta escolher A2 como (x = y0 y = x0 )[x \ x y] o que corresponde a . A2 = x y = y0 y = x0 2. Basta escolher A1 como (x y = y0 y = x0 )[y \ x y] o que corresponde a . A1 = x (x y) = y0 x y = x0 3. Falta-nos apenas provar que (x = x0 y = y0 ) A1 [x \ x + y] Note-se que o consequente desta implicao pode ser simplicado da seguinte forma: ca A1 [x \ x + y] (x (x y) = y0 x y = x0 )[x \ x + y] (y = y0 x y = x0 )[x \ x + y] y = y0 (x + y) y = x0 y = y0 x = x0

que no mais do que o seu antecendente. a e A correco de programas que envolvam condicionais descrita pela seguinte regra. ca e Condicional { P c } S1 { Q } { P c } S2 { Q } (if)

{ P } if c S1 else S2 { Q }

Exemplo 2
Para provarmos que o programa if (x > y) a = x else a = y coloca em a o mximo a dos valores de x e y, vamos usar os seguintes predicados pr-condio: x = x0 y = y0 e ca ps-condio: a = max(x0 , y0 ) o ca A prova da correco faz-se em dois passos: ca 1. Provando que { x = x0 y = y0 x > y } a = x { a = max(x0 , y0 ) }, ou seja que (x = x0 y = y0 x > y) (a = max(x0 , y0 ))[a \ x] (x = x0 y = y0 x > y) (x = max(x0 , y0 ))

2. Provando que { x = x0 y = y0 x y } a = y { a = max(x0 , y0 ) }, ou seja que (x = x0 y = y0 x y) (a = max(x0 , y0 ))[a \ y] (x = x0 y = y0 x y) (y = max(x0 , y0 ))

que so consequncia da denio de max. a e ca A correco de programas que envolvam ciclos descrita pela seguinte regra. ca e Ciclo-1 { I c ind = i0 0 } S { I 0 ind < i0 } (while-1) { I } while c S { I c } Ao predicado I que mencionado nesta regra habitual chamar invariante do ciclo. Aquilo e e que esta regra diz que: e partindo do princ pio que o invariante vlido antes da execuo do ciclo, e a ca sempre que o invariante do ciclo vlido antes de cada iterao, tambm o depois dessa e a ca e e iterao, ca por cada iterao do ciclo h uma expresso inteira e no negativa (ind) que decresce, ca a a a ento, o ciclo termina e quando termina podemos garantir que o invariante se verica e que a a condio do ciclo falsa. ca e Esta regra, conjugada com as de enfraquecimento (da ps-condio) e de fortalecimento (da o ca pr-condio), d origem ` seguinte regra, mais operacional. e ca a a Ciclo-2 P I { I c ind = i0 0 } S { I 0 ind < i0 } (I c) Q (while-2) { P } while c S { Q } Assim, para mostrar que um ciclo satisfaz uma especicao (P, Q) precisamos de encontrar ca um invariante I e uma medida de terminao ind (I um predicado, enquanto que ind uma ca e e expresso inteira e no negativa) tais que: a a 1. A pr-condio garante que o invariante comea por ser verdadeiro (P I) e ca c 2. Cada iterao do ciclo preserva a validade do invariante, alm de diminuir o valor da medida ca e de terminao; ca { I c ind = i0 0 } S { I 0 ind < i0 } 3. Quando o ciclo termina (e neste caso a condio de controlo do ciclo falsa e o invariante ca e continua vlido), a ps-condio assegurada a o ca e (I c) Q 4

Exemplo 3
O programa seguinte calcula o mximo divisor comum entre dois nmeros inteiros positivos a u (mdc). { a = a0 > 0 b = b0 > 0 } while (a != b) if (a < b) b=b-a ; else a=a-b { a = mdc(a0 , b0 ) } A demonstrao da correco baseia-se no seguinte teorema (de Euclides) ca ca mdc(x, y) = mdc(x + y, y) = mdc(x, x + y) Vamos usar como invariante o seguinte predicado . I = (mdc(a, b) = mdc(a0 , b0 )) a > 0 b > 0 Apesar de mudarmos o valor de a e b estamos a mud-los mantendo o valor do mximo a a divisor comum. Como medida de terminao vamos usar (o valor absoluto) da diferena entre a e b ca c . ind = |a b| Usando a regra (while2) temos que mostrar que: 1. (a = a0 > 0 b = b0 > 0) ((mdc(a, b) = mdc(a0 , b0 )) a > 0 b > 0) O que trivialmente verdadeiro. e 2. { (mdc(a, b) = mdc(a0 , b0 )) a > 0 b > 0 a = b |a b| = i0 > 0 } if (a<b) b = b-a ; else a = a-b { (mdc(a, b) = mdc(a0 , b0 )) a > 0 b > 0 0 |a b| < i0 } Podemos ento usar a regra (if) e temos a (a) { (mdc(a, b) = mdc(a0 , b0 )) a > 0 b > 0 a = b |a b| = i0 > 0 a < b } b = b-a { (mdc(a, b) = mdc(a0 , b0 )) a > 0 b > 0 0 |a b| < i0 } (b) { (mdc(a, b) = mdc(a0 , b0 )) a > 0 b > 0 a = b |a b| = i0 > 0 a b } a = a-b { (mdc(a, b) = mdc(a0 , b0 )) a > 0 b > 0 0 |a b| < i0 } Ambas as implicaes resultantes destas expresses so consequncia do teorema de co o a e Euclides. 3. Finalmente devemos mostrar que ((mdc(a, b) = mdc(a0 , b0 )) a > 0 b > 0 a = b) a = mdc(a0 , b0 ) O que verdadeiro, sabendo ainda que mdc(x, x) = x. e Da mesma forma que usmos as regras do ciclo, do enfraquecimento e fortalecimento para obter a esta ultima regra, podemos agora conjug-la com a regra de sequenciao para denirmos a a ca seguinte.

Ciclo-3 {P } S1 {I } { I c ind = i0 0 } S2 { I 0 ind < i0 } { P } S1 ; while c S2 { Q } Esta regra particularmente util se quisermos provar a correco de um ciclo for em C. e ca Relembre-se que em C, o programa for (X;Y;Z) W; equivalente a X ; while Y { W ; Z e }. For {P } X {I } { I Y ind = i0 0 } W;Z { I 0 ind < i0 } { P } for (X; Y ; Z) W { Q } (I Y ) Q (for) (I c) Q (while-3)

Exemplo 4
Considere-se o seguinte programa que calcula a potncia (inteira) de um dado nmero. e u r = 1; i while (i r = r i = i } = < * + 0; e) { b ; 1 ;

Vamos provar que este programa satisfaz a seguinte especicao: ca pr-condio: b = b0 e = e0 0 e ca ps-condio: r = be0 o ca 0 Para isso, e como temos um ciclo, vamos ter que denir: . um invariante do ciclo. I = b = b0 e = e0 r = bi i e 0 . uma medida de terminao. ind = e i ca Usando a regra (while-3) acima, temos que mostrar que: 1. { b = b0 e = e0 0 } r = 1; i = 0 { b = b0 e = e0 r = bi i e } 0 Isto corresponde a mostrar que (b = b0 e = e0 0) (b = b0 e = e0 r = bi i e)[r \ 1, i \ 0] 0 (b = b0 e = e0 0) (b = b0 e = e0 1 = b0 0 e) 0 2. { b = b0 e = e0 r = bi i e (i < e) (e i) = i0 0 } 0 r = r*b; i = i+1 { b = b0 e = e0 r = bi i e 0 e i < i0 } 0 que equivalente a mostrar que e b = b0 e = e0 r = bi i e (i < e) (e i) = i0 0 0 (b = b0 e = e0 r = bi i e 0 e i < i0 )[r \ r b, i \ i + 1] 0 b = b0 e = e0 r = bi i e (i < e) (e i) = i0 0 0 (b = b0 e = e0 r b = bi+1 (i + 1) e 0 e i 1 < i0 0 3. (b = b0 e = e0 r = bi i e i e) r = be0 0 0 6

Exemplo 5
Mostre que os seguintes programas satisfazem a especicao. ca pr-condio: n = n0 0 e ca ps-condio: n2 = n2 o ca 0 1. n2 = 0 ; i = 0 ; while (i < n) { n2 = n2 + (2 * i) + 1 ; i = i+1; } 2. n2 = 0 ; while (n > 0) { n2 = n2 + (2 * n) + 1; n = n-1; }

Você também pode gostar