You are on page 1of 9

POLITCNICO GRANCOLOMBIANO

ANLISIS Y VERIFICACIN DE ALGORITMOS


EJEMPLOS DE VERIFICACIN DE ALGORITMOS
Autor
: Alejandro Sotelo Arvalo
Fecha de ltima actualizacin : 2009/09/03
Notacin: Sea a%b el residuo de dividir a entre b (a%b = a mod b).

1.
Algoritmo de Euclides.
var a:,b:; (a,b constantes)
{Pre Q: ab>0}
x,y:=a,b;
{Inv P: xy0 gcd(x,y)=gcd(a,b)}
{Cota t=y}
do y0 x,y:=y,x%y od
{Pos R: x=gcd(a,b)}
A. La invariante se tiene antes
{Q} x,y:=a,b {P}
= Teorema de correccin de asignaciones
Q P[x,y:=a,b]
Suponga Q (ab>0)
P[x,y:=a,b]
= Definicin P; Sustitucin textual
ab0 gcd(a,b)=gcd(a,b)
= Hiptesis: ab0; Aritmtica
true
B. La invariante se mantiene
Se debe demostrar que el cuerpo del ciclo mantiene la invariante:
{P y0} x,y:=y,x%y {P}
= Teorema de correccin de asignaciones
P y0 P[x,y:=y,x%y]
Suponga P y0 (xy0, gcd(x,y)=gcd(a,b), y0)
P[x,y:=y,x%y]
= Definicin P; Sustitucin textual
yx%y0 gcd(y,x%y)=gcd(a,b)
= Aritmtica: como y0 y xy0, entonces x%y est definido y x%y0
yx%y gcd(y,x%y)=gcd(a,b)
= Aritmtica: como x%y<y, entonces x%yy
true gcd(y,x%y)=gcd(a,b)
= Hiptesis: gcd(x,y)=gcd(a,b)
true gcd(y,x%y)=gcd(x,y)
= Propiedad del gcd: gcd(y,x%y)=gcd(x,y) es un teorema

true true
= Lgica proposicional
true
C. La postcondicin se tiene en la terminacin
P (y0) R
= Aritmtica
P y=0 R
Suponga P y=0 (xy0 gcd(x,y)=gcd(a,b), y=0)
R
= Definicin R
x=gcd(a,b)
= Hiptesis: gcd(x,y)=gcd(a,b)
x=gcd(x,y)
= Hiptesis: y=0
x=gcd(x,0)
= Propiedad del gcd: gcd(x,0)=0
true
D. La cota decrece
La cota t=y es mayor o igual a 0 porque xy0 gracias a la invariante.
La cota t=y decrece en cada iteracin porque en el cuerpo del ciclo
y se est cambiando por x%y, que es menor que y siempre.

2.
Algoritmo de la divisin.
var b:,c:; (b,c constantes)
{Pre Q: b0 c>0}
q,r:=0,b;
{Inv P: b=q*c+r 0r}
{Cota t=r}
do rc q,r:=q+1,r-c od
{Pos R: b=q*c+r 0r<c}
A. La invariante se tiene antes
{Q} q,r:=0,b {P}
= Teorema de correccin de asignaciones
Q P[q,r:=0,b]
Suponga Q (b0, c>0)
P[q,r:=0,b]
= Definicin P; Sustitucin textual
b=0*c+b 0b
= Aritmtica; Hiptesis: b0
true
B. La invariante se mantiene
Se debe demostrar que el cuerpo del ciclo mantiene la invariante:
{P rc} q,r:=q+1,r-c {P}
= Teorema de correccin de asignaciones
P rc P[q,r:=q+1,r-c]
Suponga P rc (b=q*c+r, 0r, rc)

P[q,r:=q+1,r-c]
= Definicin P; Sustitucin textual
b=(q+1)*c+(r-c) 0r-c
= Aritmtica
b=q*c+c+r-c 0r-c
= Aritmtica
b=q*c+r cr
= Hiptesis: b=q*c+r, rc
true
C. La postcondicin se tiene en la terminacin
P (rc) R
= Aritmtica
P r<c R
Suponga P r<c (b=q*c+r, 0r, r<c)
R
= Definicin R
b=q*c+r 0r<c
= Hiptesis
true
D. La cota decrece
La cota t=r es mayor o igual a 0 porque 0r gracias a la invariante.
La cota t=r decrece en cada iteracin porque en el cuerpo del ciclo
r se est cambiando por r-c (r decrece cada vez en c unidades y
con c>0 gracias a la precondicin).

3.
Evaluacin de un polinomio en un punto: dado x, calcular f(x)=a0+a1x+a2x2+...+anxn.
var a:array[0..n] of ,x:; (a,n,x constantes)
{Pre Q: n0}
s,p,k:=0,1,0;
{Inv P: s=(i|0ik-1:a[i]*xi) p=xk 0kn+1}
{Cota t=n+1-k}
do kn s,p,k:=s+a[k]*p,p*x,k+1 od
{Pos R: s=(i|0in:a[i]*xi)}
A. La invariante se tiene antes
{Q} s,p,k:=0,1,0 {P}
= Teorema de correccin de asignaciones
Q P[s,p,k:=0,1,0]
Suponga Q (n0)
P[s,p,k:=0,1,0]
= Definicin P; Sustitucin textual
0=(i|0i0-1:a[i]*xi) 1=x0 00n+1
= Aritmtica
0=(i|0i-1:a[i]*xi) 1=1 0n+1
= Aritmtica
0=(i|false:a[i]*xi) 1=1 0n+1

= Rango vaco, 0 es la identidad de la suma; Aritmtica


0n+1
= Hiptesis: n0 (por lo tanto, n+10)
true
B. La invariante se mantiene
Se debe demostrar que el cuerpo del ciclo mantiene la invariante:
{P kn} s,p,k:=s+a[k]*p,p*x,k+1 {P}
= Teorema de correccin de asignaciones
P kn P[s,p,k:=s+a[k]*p,p*x,k+1]
Suponga P kn (s=(i|0ik-1:a[i]*xi), p=xk, 0kn+1, kn)
P[s,p,k:=s+a[k]*p,p*x,k+1]
= Definicin P; Sustitucin textual
s+a[k]*p=(i|0ik+1-1:a[i]*xi) p*x=xk+1 0k+1n+1
= Aritmtica
s+a[k]*p=(i|0ik:a[i]*xi) p*x=xk*x -1kn
= Particin de rango
s+a[k]*p=(i|0ik-1:a[i]*xi)+a[k]*xk p*x=xk*x -1kn
= Hiptesis: s=(i|0ik-1:a[i]*xi), p=xk
s+a[k]*p=s+a[k]*p p*x=p*x -1kn
= Aritmtica
-1kn
= Como 0kn+1 y kn (por hiptesis) entonces 0kn. Luego, -1kn
true
C. La postcondicin se tiene en la terminacin
P (kn) R
= Aritmtica
P k>n R
= Aritmtica
P kn+1 R
Suponga P kn+1 (s=(i|0ik-1:a[i]*xi) p=xk 0kn+1, kn+1)
R
= Definicin R
s=(i|0in:a[i]*xi)
= Como 0kn+1 y kn+1 (por hiptesis), entonces k=n+1 (o sea, n=k-1)
s=(i|0ik-1:a[i]*xi)
= Hiptesis: s=(i|0ik-1:a[i]*xi)
true
D. La cota decrece
La cota t=n+1-k es mayor o igual a 0 porque kn+1 gracias a la
invariante.
Como k crece en 1 en cada iteracin y n es constante entonces la cota
t=n+1-k decrece en 1 en cada iteracin.

4.
Algoritmo que calcula cuntos elementos de un arreglo de nmeros enteros son mltiplos de cierto
valor.
Notacin: Sea a%b el residuo de dividir a entre b (a%b = a mod b).
var b:array[0..n-1] of ,x:;
{Pre Q: n0 x>0}
i,s:=0,0;
{Inv P: s=(k|0k<ib[k]%x=0:1) 0in}
{Cota t=n-i}
do i<n {C1: P i<n}
if b[i]%x=0 s:=s+1
[] b[i]%x0 skip
fi;
{C2: P[i:=i+1]}
i:=i+1
{C3: P}
od
{Pos R: s=(k|0k<nb[k]%x=0:1)}

b,n,x constantes

A. La invariante se tiene antes


{Q} i,s:=0,0 {P}
= Teorema de correccin de asignaciones
Q P[i,s:=0,0]
Suponga Q (n0, x>0)
P[i,s:=0,0]
= Definicin P; Sustitucin textual
0=(k|0k<0b[k]%x=0:1) 00n
= Aritmtica: 0k<0 es falso, 00 es verdadero
0=(k|falseb[k]%x=0:1) 0n
= Lgica proposicional: falsep false
0=(k|false:1) 0n
= Rango vaco, 0 es la identidad de la suma; Hiptesis: n0
true
B. La invariante se mantiene
Se debe demostrar que el cuerpo del ciclo mantiene la invariante:
{C1: P i<n}
if b[i]%x=0 s:=s+1
[] b[i]%x0 skip
fi;
{C2: P[i:=i+1]}
i:=i+1
{C3: P}
A probar:
B.1. {C1} IF {C2} :
B.1.1. C1 b[i]%x=0 b[i]%x0
B.1.2. {C1 b[i]%x=0} s:=s+1 {C2}
B.1.3. {C1 b[i]%x0} skip {C2}
B.2. {C2} i:=i+1 {C3}

B.1.1.
C1 b[i]%x=0 b[i]%x0
= Aritmtica
C1 true
= Lgica proposicional: Evaluacin de
true
B.1.2.
{C1 b[i]%x=0} s:=s+1 {C2}
= Teorema de correccin de asignaciones
C1 b[i]%x=0 C2[s:=s+1]
Suponga C1 b[i]%x=0 (s=(k|0k<ib[k]%x=0:1), 0in, i<n, b[i]%x=0)
C2[s:=s+1]
= Definicin C2
P[i:=i+1][s:=s+1]
= Definicin P; Sustitucin textual
(s=(k|0k<i+1b[k]%x=0:1) 0i+1n)[s:=s+1]
= Sustitucin textual
s+1=(k|0k<i+1b[k]%x=0:1) 0i+1n
= Como 0in y i<n (por hiptesis) entonces 0in-1. Luego, 1i+1n
s+1=(k|0k<i+1b[k]%x=0:1)
= Particin de rango : 0k<i+1 0k<i k=i
s+1=(k|0k<ib[k]%x=0:1)+(k|k=ib[k]%x=0:1)
= Hiptesis: s=(k|0k<ib[k]%x=0:1)
s+1=s+(k|k=ib[k]%x=0:1)
= Aritmtica
1=(k|k=ib[k]%x=0:1)
= Leibniz [vase: Gries 3.84(a)]
1=(k|k=ib[i]%x=0:1)
= Hiptesis: b[i]%x=0
1=(k|k=i:1)
= Regla de un punto: (k|k=i:1)=1[k:=i]=1
1=1
= Aritmtica
true
B.1.3.
{C1 b[i]%x0} skip {C2}
= Teorema de correccin de skip
C1 b[i]%x0 C2
Suponga C1 b[i]%x0 (s=(k|0k<ib[k]%x=0:1), 0in, i<n, b[i]%x0)
C2
= Definicin C2
P[i:=i+1]
= Definicin P; Sustitucin textual
s=(k|0k<i+1b[k]%x=0:1) 0i+1n
= Como 0in y i<n (por hiptesis) entonces 0in-1. Luego, 1i+1n
s=(k|0k<i+1b[k]%x=0:1)
= Particin de rango : 0k<i+1 0k<i k=i
s=(k|0k<ib[k]%x=0:1)+(k|k=ib[k]%x=0:1)

= Hiptesis: s=(k|0k<ib[k]%x=0:1)
s=s+(k|k=ib[k]%x=0:1)
= Aritmtica
0=(k|k=ib[k]%x=0:1)
= Leibniz [vase: Gries 3.84(a)]
0=(k|k=ib[i]%x=0:1)
= Hiptesis: b[i]%x0
0=(k|k=ifalse:1)
= Lgica proposicional: pfalse false
0=(k|false:1)
= Rango vaco, 0 es la identidad de la suma
true
B.2.
{C2} i:=i+1 {C3}
= Teorema de correccin de asignaciones
C2 C3[i:=i+1]
= Definicin C2 (C2=P[i:=i+1]); Definicin C3 (C3=P)
P[i:=i+1] P[i:=i+1]
= Lgica proposicional: pp true
true
C. La postcondicin se tiene en la terminacin
P (i<n) R
= Aritmtica
P in R
Suponga P in (s=(k|0k<ib[k]%x=0:1), 0in, in)
R
= Definicin R
s=(k|0k<nb[k]%x=0:1)
= Como in y in (por hiptesis) entonces i=n
s=(k|0k<ib[k]%x=0:1)
= Hiptesis: s=(k|0k<ib[k]%x=0:1)
true
D. La cota decrece
La cota t=n-i es mayor o igual a 0 porque in gracias a la invariante.
Como i crece en 1 en cada iteracin y n es constante entonces la cota
t=n-i decrece en 1 en cada iteracin.

5.
Algoritmo que busca la posicin de un elemento en un arreglo (si el elemento ocurre varias veces en el
arreglo, la respuesta es cualquier posicin donde est; y si el elemento no ocurre en el arreglo, la
respuesta es el tamao del arreglo).
var b:array[0..n-1] of ,x:;
{Pre Q: n0}
i:=0;
{Inv P: (k|0ki-1:b[k]=x) 0in}
{Cota t=n-i}
do i<n b[i]x i:=i+1

(b,n,x constantes)

od
{Pos R: (0i<n b[i]=x) (i=n (k|0kn-1:b[k]=x)) 0in}
A. La invariante se tiene antes
{Q} i:=0 {P}
= Teorema de correccin de asignaciones
Q P[i:=0]
Suponga Q (n0)
P[i:=0]
= Definicin P; Sustitucin textual
(k|0k0-1:b[k]=x) 00n
= Aritmtica
(k|0k-1:b[k]=x) 00n
= Aritmtica: 0k-1 es falso, 00 es verdadero
(k|false:b[k]=x) 0n
= Rango vaco, false es la identidad de la disyuncin
false 0n
= Lgica proposicional: false true; Hiptesis: n0
true
B. La invariante se mantiene
{P (i<n b[i]x)} i:=i+1 {P}
= Teorema de correccin de asignaciones
P (i<n b[i]x) P[i:=i+1]
= Asociatividad de la conjuncin
P i<n b[i]x P[i:=i+1]
Suponga P i<n b[i]x ((k|0ki-1:b[k]=x), 0in, i<n, b[i]x)
P[i:=i+1]
= Definicin P; Sustitucin textual
(k|0ki+1-1:b[k]=x) 0i+1n
= Como 0in y i<n (por hiptesis) entonces 0in-1. Luego, 1i+1n
(k|0ki+1-1:b[k]=x)
= Aritmtica
(k|0ki:b[k]=x)
= Particin de rango : 0ki 0ki-1 k=i
((k|0ki-1:b[k]=x)(k|k=i:b[k]=x))
= Regla de un punto
((k|0ki-1:b[k]=x)b[i]=x)
= Hiptesis: b[i]x
((k|0ki-1:b[k]=x)false)
= Lgica proposicional: pfalse p
(k|0ki-1:b[k]=x)
= Hiptesis: (k|0ki-1:b[k]=x)
true
C. La postcondicin se tiene en la terminacin
Comentario: El texto en azul es formalidad que sobra
P (i<n b[i]x) R
= Lgica proposicional: De Morgan
P ((i<n) (b[i]x)) R
= Aritmtica

P (in b[i]=x) R
= Lgica proposicional: p(qr)s (pqs)(pqrs)
(P in R) (P (in) b[i]=x R)
= Aritmtica
(P in R) (P i<n b[i]=x R)
A probar:
C.1. P in R
C.2. P i<n b[i]=x R
C.1.
P in R
Suponga P in ((k|0ki-1:b[k]=x), 0in, in)
R
= Definicin R
(0i<n b[i]=x) (i=n (k|0kn-1:b[k]=x)) 0in
= Hiptesis: 0in
(0i<n b[i]=x) (i=n (k|0kn-1:b[k]=x))
= Como in y in (por hiptesis) entonces i=n
(0i<i b[i]=x) (i=i (k|0ki-1:b[k]=x))
= Aritmtica: 0i<i es falso; i=i es verdadero
(false b[i]=x) (true (k|0ki-1:b[k]=x))
= Hiptesis: (k|0ki-1:b[k]=x)
(false b[i]=x) (true true)
= Lgica proposicional: Evaluacin de
true
C.2.
P i<n b[i]=x R
Suponga P i<n b[i]=x ((k|0ki-1:b[k]=x), 0in, i<n, b[i]=x)
R
= Definicin R
(0i<n b[i]=x) (i=n (k|0kn-1:b[k]=x)) 0in
= Hiptesis: 0in
(0i<n b[i]=x) (i=n (k|0kn-1:b[k]=x))
= Como 0in y i<n (por hiptesis) entonces 0i<n
(true b[i]=x) (i=n (k|0kn-1:b[k]=x))
= Como i<n (por hiptesis) entonces i=n es falso
(true b[i]=x) (false (k|0kn-1:b[k]=x))
= Hiptesis: b[i]=x
(true true) (false (k|0kn-1:b[k]=x))
= Lgica proposicional: Evaluacin de
true
D. La cota decrece
La cota t=n-i es mayor o igual a 0 porque in gracias a la invariante.
Como i crece en 1 en cada iteracin y n es constante entonces
la cota t=n-i decrece en 1 en cada iteracin.

You might also like