Está en la página 1de 168

Introducción Transformador de predicados wp

Cálculo de invariantes

F. Flaviani1
1 DCTI

Universidad Simón Bolívar

27-10-2016 / Algoritmos 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Definición
Denotaremos por Hk (Post), a un predicado arbitrario que
describe el espacio de estados en los cuales, si el ciclo
empieza en uno de esos estados, el programa itera a lo sumo
k veces y al finalizar satisface Post

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
do i < 3 →
i ∶= i + 1
od
{true}
Los estados iniciales en los que el programa anterior itera cero
veces y termina satisfaciendo true son los que satisfacen i ≥ 3,
por lo tanto
H0 (true) ≡ i ≥ 3
.

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
do i < 3 →
i ∶= i + 1
od
{true}
El único estado en que el programa itera una vez y finaliza
satisfaciendo true es cuando i = 2, como H1 (true) incluye los
estados iniciales en los que el programa itera cero veces o una
vez entonces
H1 (true) ≡ H0 (true) ∨ i = 2

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
do i < 3 →
i ∶= i + 1
od
{true}
El único estado en que el programa itera una vez y finaliza
satisfaciendo true es cuando i = 2, como H1 (true) incluye los
estados iniciales en los que el programa itera cero veces o una
vez entonces
H1 (true) ≡ i ≥ 3 ∨ i = 2

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
do i < 3 →
i ∶= i + 1
od
{true}
De la misma forma

H2 (true) ≡ i ≥ 3 ∨ i = 2 ∨ i = 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
do i < 3 →
i ∶= i + 1
od
{true}
De la misma forma

H3 (true) ≡ i ≥ 3 ∨ i = 2 ∨ i = 1 ∨ i = 0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
do i < 3 →
i ∶= i + 1
od
{true}
De la misma forma

H4 (true) ≡ i ≥ 3 ∨ i = 2 ∨ i = 1 ∨ i = 0 ∨ i = −1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Consideremos ahora un ejemplo donde la postcondición no es


true

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
do i < 3 →
i ∶= i + 1
od
{0 = i mod(2)}
Los estados iniciales en los que el programa anterior itera cero
veces y termina satisfaciendo la postcondición son los que
satisfacen i ≥ 3 ∧ 0 = i mod(2), por lo tanto

H0 (0 = i mod(2)) ≡ i ≥ 3 ∧ 0 = i mod(2)

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
Como H1 (0 = i mod(2)) incluye los estados iniciales en los que
el programa itera cero veces o una vez entonces:

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
H1 (0 = i mod(2)) ≡ H0 (0 = i mod(2)) ∨ (i = 2 ∧ 0 = i + 1 mod(2))

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
H1 (0 = i mod(2)) ≡ (i ≥ 3 ∧ 0 = i mod(2)) ∨ (i = 2 ∧ 0 =
i + 1 mod(2))

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
H1 (0 = i mod(2)) ≡ (i ≥ 3 ∧ 0 = i mod(2)) ∨ false

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
H1 (0 = i mod(2)) ≡ i ≥ 3 ∧ 0 = i mod(2)

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
H1 (0 = i mod(2)) ≡ H0 (0 = i mod(2))

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Ejemplo
H1 (0 = i mod(2)) ≡ H0 (0 = i mod(2))

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Con todo lo que hemos visto sobre Hk (Post) podemos definir

wp(do B0 → S0 od, Post)


(∃k ∣k ≥ 0 ∶ Hk (Post))

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Donde

H0 (Post) ≡ biendef (B0 ) ∧ ¬B0 ∧ Post

Hk (Post) ≡ H0 (Post) ∨ (biendef (B0 ) ∧ B0 ∧ wp(S0 , Hk −1 (Post)))

si k ≥ 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Se puede demostrar que Hk (Post) es un invariante, de modo


que si tenemos algún teorema que nos ayude calcular el
predicado Hk (Post) para algunos k de forma suficientemente
general, entonces podríamos usar Hk (Post) como
precondición de un ciclo Do sin necesidad de hacer las
verificaciones que establece el teorema de la invarianza.

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Veamos algunos teoremas relacionados a Hk (Post)

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Consideremos un ciclo Do con la siguiente estructura

do i ≠ N →
S0 ;
i ∶= i + 1
od
{Post}

Donde S0 es un bloque de instrucciones que no modifica las


variable i y N. Para poder calcular la precondición más débil de
un ciclo de este estilo, presentamos el siguiente teorema y
Corolario.

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Teorema
Sea un algoritmo con la estructura que se presentó
anteriormente y k , k ′ son variable que no ocurren en S0 y Post,
entonces:
1 Si existe un predicado inv tal que inv [i ∶= N] ≡ Post y
(∀i∣N − k ≤ i < N ∶ wp(S0 ; i ∶= i + 1, inv ) ≡ inv ), donde las
variables k y k ′ no ocurren en inv , entonces

Hk ′ (Post) ≡ N − k ′ ≤ i ≤ N ∧ inv

para todo k ′ tal que 0 ≤ k ′ ≤ k .


2 Adicionalmente si wp(S0 ; i ∶= i + 1, inv ) ≡ False cuando
i = N − (k + 1), entonces

Hk +1 (Post) ≡ Hk (Post)

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Corolario
Si un predicado inv cumple con las hipótesis del caso 1 del
teorema 2 para todo k y no cumple con la hipótesis del caso 2
del mismo teorema, entonces

wp(do B0 → S0 ; i ∶= i + 1 od, Post) ≡ i ≤ N ∧ inv

por otro lado, si inv cumple con las hipótesis de los casos 1 y 2,
entonces

wp(do B0 → S0 ; i ∶= i + 1 od, Post) ≡ N − k ≤ i ≤ N ∧ inv

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Teorema
Sea un algoritmo con la estructura mostrada anteriormente, 
una variable distinta de N que no ocurre en S0 ; i ∶= i + 1 ni en
Post, i no ocurre en Post, S0 es una instrucción determinista y
definiendo el predicado PostG tal que satisfaga las siguientes
ecuaciones recursivas:
PostG[ ∶= 0] ≡ Post
PostG ≡ wp(S0 ; i ∶= i + 1, PostG[ ∶=  − 1]) para 0 <  ≤ k
entonces el predicado PostG[ ∶= N − i] es un predicado, que
satisface las hipótesis del caso 1 del teorema 2.

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Veamos ejemplos de cálculo de invariantes

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

do i ≠ N →
suma ∶= suma + i ∗ i;
i ∶= i + 1
od
N−1
{Post ∶ N ≥ 0 ∧ suma = ∑ j 2 }
j=0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 0

N−1
{Post ∶ N ≥ 0 ∧ suma = ∑ j 2 }
j=0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

suma ∶= suma + i ∗ i;
i ∶= i + 1
N−1
{Post ∶ N ≥ 0 ∧ suma = ∑ j 2 }
j=0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

suma ∶= suma + i ∗ i;
N−1
{PostG(1) ∶ N ≥ 0 ∧ suma = ∑ j 2 }
j=0
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

N−1
{PostG(1) ∶ N ≥ 0 ∧ suma + i 2 = ∑ j 2 }
j=0
suma ∶= suma + i ∗ i;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

suma ∶= suma + i ∗ i;
i ∶= i + 1
N−1
{PostG(1) ∶ N ≥ 0 ∧ suma + i 2 = ∑ j 2 }
j=0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

suma ∶= suma + i ∗ i;
N−1
{PostG(2) ∶ N ≥ 0 ∧ suma + (i + 1)2 = ∑ j 2 }
j=0
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

N−1
{PostG(2) ∶ N ≥ 0 ∧ suma + i 2 + (i + 1)2 = ∑ j 2 }
j=0
suma ∶= suma + i ∗ i;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 3

suma ∶= suma + i ∗ i;
i ∶= i + 1
N−1
{PostG(2) ∶ N ≥ 0 ∧ suma + i 2 + (i + 1)2 = ∑ j 2 }
j=0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 3

suma ∶= suma + i ∗ i;
N−1
{PostG(3) ∶ N ≥ 0 ∧ suma + (i + 1)2 + (i + 2)2 = ∑ j 2 }
j=0
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 3

N−1
{PostG(3) ∶ N ≥ 0 ∧ suma + i 2 + (i + 1)2 + (i + 2)2 = ∑ j 2 }
j=0
suma ∶= suma + i ∗ i;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 0
N−1
N ≥ 0 ∧ suma = ∑ j 2
j=0

Para  = 1
N−1
N ≥ 0 ∧ suma + i 2 = ∑ j 2
j=0

Para  = 2
N−1
N ≥ 0 ∧ suma + i 2 + (i + 1)2 = ∑ j 2
j=0

Para  = 3
N−1
N ≥ 0 ∧ suma + i 2 + (i + 1)2 + (i + 2)2 = ∑ j 2
j=0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG ≡

i+−1 N−1
N ≥ 0 ∧ suma + ∑ j 2 = ∑ j 2
j=i j=0

Para 0 ≤  y i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

i+−1 N−1
(N ≥ 0 ∧ suma + ∑ j 2 = ∑ j 2 )[ ∶= N − i]
j=i j=0

Para i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

i+N−i−1 N−1
N ≥ 0 ∧ suma + ∑ j2 = ∑ j2
j=i j=0

Para i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

N−1 N−1
N ≥ 0 ∧ suma + ∑ j 2 = ∑ j 2
j=i j=0

Para i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

wp(Do, Post) ≡

N−1 N−1
i ≤ N ∧ N ≥ 0 ∧ suma + ∑ j 2 = ∑ j 2
j=i j=0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

N−1 N−1
{i ≤ N ∧ N ≥ 0 ∧ suma + ∑ j 2 = ∑ j 2 }
j=i j=0
do i ≠ N →
suma ∶= suma + i ∗ i;
i ∶= i + 1
od
N−1
{Post ∶ N ≥ 0 ∧ suma = ∑ j 2 }
j=0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Veamos ahora otro ejemplo

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

do i ≠ N →
fact ∶= fact ∗ i;
i ∶= i + 1
od
{Post ∶ N > 0 ∧ fact = (N − 1)!}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 0

{Post ∶ N > 0 ∧ fact = (N − 1)!}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

fact ∶= fact ∗ i;
i ∶= i + 1
{Post ∶ N > 0 ∧ fact = (N − 1)!}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

fact ∶= fact ∗ i;
{PostG(1) ∶ N > 0 ∧ fact = (N − 1)!}
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG(1) ∶ N > 0 ∧ fact ∗ i = (N − 1)!}


fact ∶= fact ∗ i;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

fact ∶= fact ∗ i;
i ∶= i + 1
{PostG(1) ∶ N > 0 ∧ fact ∗ i = (N − 1)!}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

fact ∶= fact ∗ i;
{PostG(2) ∶ N > 0 ∧ fact ∗ (i + 1) = (N − 1)!}
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG(2) ∶ N > 0 ∧ fact ∗ i ∗ (i + 1) = (N − 1)!}


fact ∶= fact ∗ i;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 3

fact ∶= fact ∗ i;
i ∶= i + 1
{PostG(2) ∶ N > 0 ∧ fact ∗ i ∗ (i + 1) = (N − 1)!}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 3

fact ∶= fact ∗ i;
{PostG(3) ∶ N > 0 ∧ fact ∗ (i + 1) ∗ (i + 2) = (N − 1)!}
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 3

{PostG(3) ∶ N > 0 ∧ fact ∗ i ∗ (i + 1) ∗ (i + 2) = (N − 1)!}


fact ∶= fact ∗ i;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 0
N > 0 ∧ fact = (N − 1)!
Para  = 1
N > 0 ∧ fact ∗ i = (N − 1)!
Para  = 2
N > 0 ∧ fact ∗ i ∗ (i + 1) = (N − 1)!
Para  = 3

N > 0 ∧ fact ∗ i ∗ (i + 1) ∗ (i + 2) = (N − 1)!

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG ≡

N > 0 ∧ fact ∗ i ∗ (i + 1) ∗ (i + 2) ∗ ⋅ ⋅ ⋅ ∗ (i +  − 1) = (N − 1)!

Para 0 ≤  ≤ N − 1 y 1 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

(N > 0∧fact ∗i ∗(i +1)∗(i +2)∗⋅ ⋅ ⋅∗(i +−1) = (N −1)!)[ ∶= N −i]

Para 1 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

N > 0 ∧ fact ∗ i ∗ (i + 1) ∗ (i + 2) ∗ ⋅ ⋅ ⋅ ∗ (i + N − i − 1) = (N − 1)!

Para 1 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

N > 0 ∧ fact ∗ i ∗ (i + 1) ∗ (i + 2) ∗ ⋅ ⋅ ⋅ ∗ (N − 1) = (N − 1)!

Para 1 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

N > 0 ∧ fact ∗ (N − 1) ∗ (N − 2) ∗ ⋅ ⋅ ⋅ ∗ (i + 1) ∗ i = (N − 1)!

Para 1 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

N > 0∧fact∗(N−1)∗(N−2)∗⋅ ⋅ ⋅∗(i+1)∗i = (N−1)∗(N−2)∗⋅ ⋅ ⋅∗(i+1)∗i∗(i−

Para 1 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

N > 0 ∧ fact = (i − 1)!


Para 1 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

HN−1 (Post) ≡

1 ≤ i ≤ N ∧ N > 0 ∧ fact = (i − 1)!

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

1 ≤ i ≤ N ∧ N > 0 ∧ fact = (i − 1)!


do i ≠ N →
fact ∶= fact ∗ i;
i ∶= i + 1
od
{Post ∶ N > 0 ∧ fact = (N − 1)!}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Veamos otro ejemplo

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

do i ≠ N →
x, z ∶= z, x + z;
i ∶= i + 1
od
{Post ∶ N > 0 ∧ x = fib(N) ∧ z = fib(N + 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 0

{Post ∶ N > 0 ∧ x = fib(N) ∧ z = fib(N + 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

x, z ∶= z, x + z;
i ∶= i + 1
{Post ∶ N > 0 ∧ x = fib(N) ∧ z = fib(N + 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

x, z ∶= z, x + z;
{PostG(1) ∶ N > 0 ∧ x = fib(N) ∧ z = fib(N + 1)}
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG(1) ∶ N > 0 ∧ z = fib(N) ∧ x + z = fib(N + 1)}


x, z ∶= z, x + z;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG(1) ∶ N > 0 ∧ z = fib(N) ∧ x + fib(N) = fib(N + 1)}


x, z ∶= z, x + z;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG(1) ∶ N > 0 ∧ z = fib(N) ∧ x = fib(N + 1) − fib(N)}


x, z ∶= z, x + z;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG(1) ∶ N > 0 ∧ z = fib(N) ∧ x = fib(N − 1) + fib(N) − fib(N)}


x, z ∶= z, x + z;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG(1) ∶ N > 0 ∧ z = fib(N) ∧ x = fib(N − 1)}


x, z ∶= z, x + z;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

x, z ∶= z, x + z;
i ∶= i + 1
{PostG(1) ∶ N > 0 ∧ z = fib(N) ∧ x = fib(N − 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

x, z ∶= z, x + z;
{PostG(2) ∶ N > 0 ∧ z = fib(N) ∧ x = fib(N − 1)}
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG(2) ∶ N > 0 ∧ x + z = fib(N) ∧ z = fib(N − 1)}


x, z ∶= z, x + z;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG(2) ∶ N > 0 ∧ x + z = fib(N − 2) + fib(N − 1) ∧ z = fib(N − 1)}


x, z ∶= z, x + z;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG(2) ∶ N > 0 ∧ x + fib(N − 1) = fib(N − 2) + fib(N − 1) ∧ z = fib(N −


x, z ∶= z, x + z;
i ∶= i + 1
Para N > 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG(2) ∶ N > 0 ∧ x = fib(N − 2) ∧ z = fib(N − 1)}


x, z ∶= z, x + z;
i ∶= i + 1
Para N > 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 3

x, z ∶= z, x + z;
i ∶= i + 1
{PostG(2) ∶ N > 0 ∧ x = fib(N − 2) ∧ z = fib(N − 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 3

x, z ∶= z, x + z;
{PostG(3) ∶ N > 0 ∧ x = fib(N − 2) ∧ z = fib(N − 1)}
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 3

{PostG(3) ∶ N > 0 ∧ z = fib(N − 2) ∧ x + z = fib(N − 1)}


x, z ∶= z, x + z;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 3

{PostG(3) ∶ N > 0 ∧ z = fib(N − 2) ∧ x + z = fib(N − 3) + fib(N − 2)}


x, z ∶= z, x + z;
i ∶= i + 1
Para N > 2

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 3

{PostG(3) ∶ N > 0 ∧ z = fib(N − 2) ∧ x + fib(N − 2) = fib(N − 3) + fib(N −


x, z ∶= z, x + z;
i ∶= i + 1
Para N > 2

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 3

{PostG(3) ∶ N > 0 ∧ z = fib(N − 2) ∧ x = fib(N − 3)}


x, z ∶= z, x + z;
i ∶= i + 1
Para N > 2

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 0
N > 0 ∧ z = fib(N + 1) ∧ x = fib(N)
Para  = 1
N > 0 ∧ z = fib(N) ∧ x = fib(N − 1)
Para  = 2

N > 0 ∧ z = fib(N − 1) ∧ x = fib(N − 2)

Para  = 3

N > 0 ∧ z = fib(N − 2) ∧ x = fib(N − 3)

Para N ≥ 3

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG ≡

N > 0 ∧ z = fib(N − ( − 1)) ∧ x = fib(N − )


Para 0 ≤  ≤ N y N − N ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG ≡

N > 0 ∧ z = fib(N − ( − 1)) ∧ x = fib(N − )


Para 0 ≤  ≤ N y 0 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

(N > 0 ∧ z = fib(N − ( − 1)) ∧ x = fib(N − ))[ ∶= N − i]


Para 0 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

N > 0 ∧ z = fib(N − (N − i − 1)) ∧ x = fib(N − (N − i))


Para 0 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

N > 0 ∧ z = fib(N + 1 + i)) ∧ x = fib(N + i)


Para 0 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

HN (Post) ≡

0 ≤ i ≤ N ∧ N > 0 ∧ z = fib(N + 1 + i)) ∧ x = fib(N + i)

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

{0 ≤ i ≤ N ∧ N > 0 ∧ x = fib(N) ∧ z = fib(N + 1)}


do i ≠ N →
x, z ∶= z, x + z;
i ∶= i + 1
od
{Post ∶ N > 0 ∧ x = fib(N) ∧ z = fib(N + 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

N ≥ 0 ∧ x = sig(i)i+1 fib(∣i∣) ∧ z = sig(i)i fib(∣i + 1∣)


Para i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Suceción de fibonacci extendida a los números negativos


. . . , 34, -21, 13, -8, 5, -3, 2, -1, 1, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34,

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

[Const N ∶ Entero;
S ∶ Arreglo [0..N) de enteros;
Var i ∶ Entero;
pal ∶ Booleano;

num, i ∶= 0, 0;
do i ≠ N →
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
od
{num = (+ k ∣0 ≤ k < N ∧ S[k ] > 0 ∶ 1)}
]

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Por simplicidad obviaremos la declaración de variables

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

do i ≠ N →
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
od
{num = (+ k ∣0 ≤ k < N ∧ S[k ] > 0 ∶ 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Usaremos una notación más compacta para la sumatoria

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

do i ≠ N →
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
od
{num = (+ k ∣0 ≤ k < N ∧ S[k ] > 0 ∶ 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

do i ≠ N →
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
od
{num = ∑ 1}
0≤k <N
S[k ]>0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Calculemos el soporte de la instrucción IF

if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi
{true}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

{biendef (S[i] > 0, S[i] ≤ 0) ∧ (S[i] > 0 ∨ S[i] ≤ 0)∧


(S[i] > 0 ⇒ wp(num ∶= num + 1, true))∧
(S[i] ≤ 0 ⇒ wp(num ∶= num + 1, true))}
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

{biendef (S[i] > 0, S[i] ≤ 0) ∧ (S[i] > 0 ∨ S[i] ≤ 0)∧


(S[i] > 0 ⇒ true) ∧ (S[i] ≤ 0 ⇒ true)}
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

{biendef (S[i] > 0, S[i] ≤ 0) ∧ (S[i] > 0 ∨ S[i] ≤ 0)∧


true ∧ true}
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

{biendef (S[i] > 0, S[i] ≤ 0) ∧ (S[i] > 0 ∨ S[i] ≤ 0)}


if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

{biendef (S[i] > 0, S[i] ≤ 0) ∧ true}


if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

{0 ≤ i < N ∧ true}
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Concluimos que

soporte(IF ) ≡ 0 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Tratemos ahora de conseguir una fórmula general para wp del


ciclo

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 0

{Post ∶ num = ∑ 1}
0≤k <N
S[k ]>0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
{Post ∶ num = ∑ 1}
0≤k <N
S[k ]>0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
{Post ∶ (num = ∑ 1)[i ∶= i + 1]}
0≤k <N
S[k ]>0
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
{Post ∶ num = ∑ 1}
0≤k <N
S[k ]>0
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG1 ∶ biendef (S[i] > 0, S[i] ≤ 0) ∧ (S[i] > 0 ∨ S[i] ≤ 0)∧


(S[i] > 0 ⇒ wp(num ∶= num + 1, num = ∑ 1))∧
0≤k <N
S[k ]>0
(S[i] ≤ 0 ⇒ wp(SKIP, num = ∑ 1))}
0≤k <N
S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG1 ∶ 0 ≤ i < N ∧ (S[i] > 0 ∨ S[i] ≤ 0)∧


(S[i] > 0 ⇒ wp(num ∶= num + 1, num = ∑ 1))∧
0≤k <N
S[k ]>0
(S[i] ≤ 0 ⇒ wp(SKIP, num = ∑ 1))}
0≤k <N
S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG1 ∶ 0 ≤ i < N ∧ true∧


(S[i] > 0 ⇒ wp(num ∶= num + 1, num = ∑ 1))∧
0≤k <N
S[k ]>0
(S[i] ≤ 0 ⇒ wp(SKIP, num = ∑ 1))}
0≤k <N
S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG1 ∶ 0 ≤ i < N∧
(S[i] > 0 ⇒ wp(num ∶= num + 1, num = ∑ 1))∧
0≤k <N
S[k ]>0
(S[i] ≤ 0 ⇒ wp(SKIP, num = ∑ 1))}
0≤k <N
S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG1 ∶ 0 ≤ i < N∧
(S[i] > 0 ⇒ (num = ∑ 1))[num ∶= num + 1]∧
0≤k <N
S[k ]>0
(S[i] ≤ 0 ⇒ num = ∑ 1)}
0≤k <N
S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG1 ∶ 0 ≤ i < N∧
(S[i] > 0 ⇒ num + 1 = ∑ 1)∧
0≤k <N
S[k ]>0
(S[i] ≤ 0 ⇒ num = ∑ 1)}
0≤k <N
S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG1 ∶ 0 ≤ i < N∧
(S[i] > 0 ⇒ num + 1 = ∑ 1)∧
0≤k <N
S[k ]>0
(S[i] ≤ 0 ⇒ num + 0 = ∑ 1)}
0≤k <N
S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG1 ∶ 0 ≤ i < N∧
(S[i] > 0 ⇒ num + (+ k ∣i = k ∧ S[k ] > 0 ∶ 1) = ∑ 1)∧
0≤k <N
S[k ]>0
(S[i] ≤ 0 ⇒ num + 0 = ∑ 1)}
0≤k <N
S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 1 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG1 ∶ 0 ≤ i < N∧
(S[i] > 0 ⇒ num + (+ k ∣i = k ∧ S[k ] > 0 ∶ 1) = ∑ 1)∧
0≤k <N
S[k ]>0
(S[i] ≤ 0 ⇒ num + (+ k ∣i = k ∧ S[k ] > 0 ∶ 1) = ∑ 1)}
0≤k <N
S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 1 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG1 ∶ 0 ≤ i < N∧
(S[i] > 0 ⇒ num + ∑ 1 = ∑ 1)∧
k =i 0≤k <N
S[k ]>0 S[k ]>0
(S[i] ≤ 0 ⇒ num + (+ k ∣i = k ∧ S[k ] > 0 ∶ 1) = ∑ 1)}
0≤k <N
S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 1 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG1 ∶ 0 ≤ i < N∧
(S[i] > 0 ⇒ num + ∑ 1 = ∑ 1)∧
k =i 0≤k <N
S[k ]>0 S[k ]>0
(S[i] ≤ 0 ⇒ num + ∑ 1 = ∑ 1)}
k =i 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 1 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG1 ∶ 0 ≤ i < N∧
num + ∑ 1 = ∑ 1}
k =i 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 1 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 1

{PostG1 ∶ 0 ≤ i < N∧
num + ∑ 1 = ∑ 1}
i≤k <i+1 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 1 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
{PostG1 ∶ 0 ≤ i < N ∧ num + ∑ 1 = ∑ 1}
i≤k <i+1 0≤k <N
S[k ]>0 S[k ]>0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
{PostG1 ∶ 0 ≤ i + 1 < N ∧ num + ∑ 1 = ∑ 1}
i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
{PostG1 ∶ −1 ≤ i < N − 1 ∧ num + ∑ 1 = ∑ 1}
i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG2 ∶ wp(IF , −1 ≤ i < N − 1 ∧ num + ∑ 1 = ∑ 1)}


i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG2 ∶ wp(IF , −1 ≤ i < N − 1) ∧ wp(IF , num + ∑ 1 = ∑ 1)}


i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG2 ∶ soporte(IF ) ∧ −1 ≤ i < N − 1∧


wp(IF , num + ∑ 1 = ∑ 1)}
i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG2 ∶ 0 ≤ i < N ∧ −1 ≤ i < N − 1∧


wp(IF , num + ∑ 1 = ∑ 1)}
i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 2 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG2 ∶ 0 ≤ i < N ∧ 0 ≤ i < N − 1∧


wp(IF , num + ∑ 1 = ∑ 1)}
i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 2 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG2 ∶ 0 ≤ i < N ∧ 0 ≤ i < N − 1∧


(S[i] > 0 ⇒ wp(num ∶= num + 1, num + ∑ 1 = ∑ 1))∧
i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
(S[i] ≤ 0 ⇒ wp(SKIP, num + ∑ 1 = ∑ 1))}
i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 2 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG2 ∶ 0 ≤ i < N ∧ 0 ≤ i < N − 1∧


(S[i] > 0 ⇒ num + 1 + ∑ 1 = ∑ 1)∧
i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
(S[i] ≤ 0 ⇒ num + ∑ 1 = ∑ 1)}
i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 2 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG2 ∶ 0 ≤ i < N ∧ 0 ≤ i < N − 1∧


(S[i] > 0 ⇒ num + 1 + ∑ 1 = ∑ 1)∧
i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
(S[i] ≤ 0 ⇒ num + 0 + ∑ 1 = ∑ 1)}
i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 2 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG2 ∶ 0 ≤ i < N ∧ 0 ≤ i < N − 1∧


(S[i] > 0 ⇒ num + ∑ 1 + ∑ 1 = ∑ 1)∧
k =i i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0 S[k ]>0
(S[i] ≤ 0 ⇒ num + 0 + ∑ 1 = ∑ 1)}
i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 2 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG2 ∶ 0 ≤ i < N ∧ 0 ≤ i < N − 1∧


(S[i] > 0 ⇒ num + ∑ 1 + ∑ 1 = ∑ 1)∧
k =i i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0 S[k ]>0
(S[i] ≤ 0 ⇒ num + ∑ 1 + ∑ 1 = ∑ 1)}
k =i i+1≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 2 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG2 ∶ 0 ≤ i < N ∧ 0 ≤ i < N − 1∧


(S[i] > 0 ⇒ num + ∑ 1 = ∑ 1)∧
i≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
(S[i] ≤ 0 ⇒ num + ∑ 1 = ∑ 1)}
i≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 2 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 2

{PostG2 ∶ 0 ≤ i < N ∧ 0 ≤ i < N − 1∧


num + ∑ 1 = ∑ 1
i≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
Para 2 ≤ N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Para  = 0
num = ∑ 1
0≤k <N
S[k ]>0

Para  = 1
0 ≤ i < N ∧ num + ∑ 1 = ∑ 1
i≤k <i+1 0≤k <N
S[k ]>0 S[k ]>0

Para  = 2

0 ≤ i < N ∧ 0 ≤ i < N − 1 ∧ num + ∑ 1 = ∑ 1


i≤k <i+2 0≤k <N
S[k ]>0 S[k ]>0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG ≡

(∀k ∣0 < k ≤  ∶ 0 ≤ i < N − (k − 1)) ∧ num + ∑ 1 = ∑ 1


i≤k <i+ 0≤k <N
S[k ]>0 S[k ]>0

Para 0 ≤  ≤ N y 0 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG ≡

(∀k ∣0 < k ≤  ∶ 0 ≤ i < N − ( − 1)) ∧ num + ∑ 1 = ∑ 1


i≤k <i+ 0≤k <N
S[k ]>0 S[k ]>0

Para 0 ≤  ≤ N y 0 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG ≡

(0 <  ⇒ 0 ≤ i < N − ( − 1)) ∧ num + ∑ 1 = ∑ 1


i≤k <i+ 0≤k <N
S[k ]>0 S[k ]>0

Para 0 ≤  ≤ N y 0 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

(0 < N − i ⇒ 0 ≤ i < N − (N − i − 1)) ∧ num + ∑ 1= ∑ 1


i≤k <i+N−i 0≤k <N
S[k ]>0 S[k ]>0

Para 0 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

(0 < N − i ⇒ 0 ≤ i < i + 1) ∧ num + ∑ 1 = ∑ 1


i≤k <N 0≤k <N
S[k ]>0 S[k ]>0

Para 0 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

(0 < N − i ⇒ 0 ≤ i ∧ i < i + 1) ∧ num + ∑ 1 = ∑ 1


i≤k <N 0≤k <N
S[k ]>0 S[k ]>0

Para 0 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

(0 < N − i ⇒ 0 ≤ i ∧ true) ∧ num + ∑ 1 = ∑ 1


i≤k <N 0≤k <N
S[k ]>0 S[k ]>0

Para 0 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

PostG[ ∶= N − i] ≡

(0 < N − i ⇒ 0 ≤ i) ∧ num + ∑ 1 = ∑ 1
i≤k <N 0≤k <N
S[k ]>0 S[k ]>0

Para 0 ≤ i < N

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

La precondición más débil del ciclo es:

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

0 ≤ i < N∧(0 < N−i ⇒ 0 ≤ i)∧0 ≤ i∧−1 < N∧num+ ∑ 1 = ∑ 1


i≤k <N 0≤k <N
S[k ]>0 S[k ]>0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

0 ≤ i < N ∧ num + ∑ 1 = ∑ 1
i≤k <N 0≤k <N
S[k ]>0 S[k ]>0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

0 ≤ i < N ∧ num = ∑ 1 − ∑ 1
0≤k <N i≤k <N
S[k ]>0 S[k ]>0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

0 ≤ i < N ∧ num = ∑ 1
0≤k <i
S[k ]>0

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

i, num ∶= 0, 0;
{0 ≤ i < N ∧ num = ∑ 1}
0≤k <i
S[k ]>0
do i ≠ N →
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
od
{num = (+ k ∣0 ≤ k < N ∧ S[k ] > 0 ∶ 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

{0 ≤ 0 < N ∧ 0 = ∑ 1}
0≤k <0
S[k ]>0
i, num ∶= 0, 0;
do i ≠ N →
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
od
{num = (+ k ∣0 ≤ k < N ∧ S[k ] > 0 ∶ 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

{0 ≤ 0 < N ∧ 0 = 0}
i, num ∶= 0, 0;
do i ≠ N →
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
od
{num = (+ k ∣0 ≤ k < N ∧ S[k ] > 0 ∶ 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

{0 ≤ 0 ∧ 0 < N ∧ 0 = 0}
i, num ∶= 0, 0;
do i ≠ N →
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
od
{num = (+ k ∣0 ≤ k < N ∧ S[k ] > 0 ∶ 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

{true ∧ 0 < N ∧ true}


i, num ∶= 0, 0;
do i ≠ N →
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
od
{num = (+ k ∣0 ≤ k < N ∧ S[k ] > 0 ∶ 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

{0 < N}
i, num ∶= 0, 0;
do i ≠ N →
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
od
{num = (+ k ∣0 ≤ k < N ∧ S[k ] > 0 ∶ 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

{N > 0}
i, num ∶= 0, 0;
do i ≠ N →
if S[i] > 0 →
num ∶= num + 1
[] S[i] ≤ 0 →
SKIP
fi;
i ∶= i + 1
od
{num = (+ k ∣0 ≤ k < N ∧ S[k ] > 0 ∶ 1)}

Flaviani Algoritmos 1
Introducción Transformador de predicados wp

Lecturas

Edsger W Dijkstra. Guarded commands, nondeterminacy


and formal derivation of programs. Communications of
the ACM, 18(8):453-457, 1975.
Charles Antony Richard Hoare. An axiomatic basis for
computer programming. Communications of the ACM,
12(10):576-580,1969.
Carroll Morgan. The specification statement. ACM
Transactions on Programming Languages and Systems,
10(3):403-419, 1988.
David Gries. The Science of Programming. New York
,New York: Springer, 1981.

Flaviani Algoritmos 1