Cálculo de invariantes
F. Flaviani1
1 DCTI
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
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
≡
(∃k ∣k ≥ 0 ∶ Hk (Post))
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Donde
si k ≥ 1
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
do i ≠ N →
S0 ;
i ∶= i + 1
od
{Post}
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
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
por otro lado, si inv cumple con las hipótesis de los casos 1 y 2,
entonces
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
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
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
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
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
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
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
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG ≡
Para 0 ≤ ≤ N − 1 y 1 ≤ i < N
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
Para 1 ≤ i < N
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
Para 1 ≤ i < N
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
Para 1 ≤ i < N
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
Para 1 ≤ i < N
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
Para 1 ≤ i < N
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
HN−1 (Post) ≡
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
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
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
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 1
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 1
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 1
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 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
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
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
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 3
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 3
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 3
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
Para = 3
Para N ≥ 3
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG ≡
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG ≡
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
HN (Post) ≡
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
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
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
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
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
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
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
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
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 1
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 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
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
Para = 2
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
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG ≡
Para 0 ≤ ≤ N y 0 ≤ i < N
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG ≡
Para 0 ≤ ≤ N y 0 ≤ i < N
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG ≡
Para 0 ≤ ≤ N y 0 ≤ i < N
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
Para 0 ≤ i < N
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
Para 0 ≤ i < N
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
Para 0 ≤ i < N
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
PostG[ ∶= N − i] ≡
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
Flaviani Algoritmos 1
Introducción Transformador de predicados wp
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
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
Flaviani Algoritmos 1