Está en la página 1de 20

Derivación de programas

Rodrigo Cardoso
Universidad de los Andes
Departamento de Ingeniería de Sistemas y Computación
Agenda

• …

• Desarrollo de ciclos

• Desarrollo de invariantes
• Técnicas semánticas
• Técnicas sintácticas

Derivación de programas 2
Eliminar una conjunción

• Si la poscondición es de la forma
R  R1  R2

se propone como invariante


P  R1

• En este caso, la guarda puede ser


BB  R2

(en realidad, basta escoger BB de modo que R2  BB)

• La técnica no sugiere una cota para proponer.

Derivación de programas 3
Raíz cuadrada entera
[Ctx: n:nat

a:= 0;

{Inv P1: a2  n }
{Cota t1: n – a2 }

do n  (a+1)2 → a:= a+1 od

{R2: a2  n < (a+1)2 }

{R1: a  n < a+1 }

{Pos: a =  n  }
] T(n) = (n)
S(n) = (1)

Derivación de programas 4
Raíz cuadrada entera (cont.)
[Ctx: n:nat

a:= n;

{Inv P2: n < (a+1)2 }


{Cota t1: (a+1)2 - n }

do a2 > n → a:= a-1 od

{R2: a2  n < (a+1)2 }

{R1: a  n < a+1 }

{Pos: a =  n  }
] T(n) = (n)
S(n) = (1)

Derivación de programas 5
¿Es factorial?
[Ctx: n:nat+

k:= 1;

{Inv P: k>0  k!  n }
{Cota t1: n – k! }

do n  (k+1)! → k:= k+1 od

{R1: k>0  k!  n < (k+1)! }

esfact:= (k! = n)

{Pos: esfact = (k|: n=k!) }


] T(n) = (fact-1(n)*costo(n!))
S(n) = (1)

Derivación de programas 6
¿Es factorial? (cont.)
[Ctx: n:nat+

k,m:= 1,1;

{Inv P: k>0  m = k!  n }
{Cota t1: (k+1)! - n }

do n  m*(k+1) → k,m:= k+1, m*(k+1) od

{R1: k>0  m = k!  n < (k+1)! }

esfact:= (m = n)

{Pos: esfact = (k|: n=k!) }


] T(n) = (fact-1(n)*costo(*))
S(n) = (1)

Derivación de programas 7
¿Es factorial? (cont.)
[Ctx: n:nat+

k,m,m1:= 1,1,2;

{Inv P: k>0  m = k!  n  m1 = (k+1)!}


{Cota t1: (k+1)! - n }

do n  m1 → k,m,m1:= k+1,m1,m*(k+1) od

{R1: k>0  m = k!  n < (k+1)! }

esfact:= (m = n)

{Pos: esfact = (k|: n=k!) }


] T(n) = (fact-1(n)*costo(*))
S(n) = (1)

Derivación de programas 8
Remplazar constante por variable

• Si la poscondición es de la forma
R[c] // c Constante

se propone como invariante


P  R[x]  xD // cD

• En este caso, la guarda puede ser


BB  x  c

• La cota puede ser de la forma (dist es una medida de distancia)

t  dist(x,c)

Derivación de programas 9
Remplazar constante por variable (cont.)

La técnica es típica de ciclos “for” [Ctx: n:nat

Por ejemplo, si la poscondición es de la forma i,suma:= 0,0;


R: suma = (+k| 0k<n : k)
{Inv P: 0in  suma = (+k| 0k<i : k)}
el invariante y la cota que se proponen son {Cota t: n-i }
P: 0in  suma = (+k| 0k<i : k)
do i  n → i,suma:= i+1,suma+i od
t: n-i
{Pos R: suma = (+k| 0k<n : k) }
Y el programa que resulta es: ]

O bien:

suma:= 0;
for i:= 0 to n-1 → suma:= suma+i rof

Derivación de programas 10
El problema de la planicie

2
1

• Dado un arreglo b[0..n-1]:int, una planicie es un subintervalo p..q de 0..n-1 en el que el


arreglo b es constante.

• Si b[p..q] es un planicie, su longitud es q-p+1

• Se quiere determinar la longitud de la planicie más larga para b[0..n-1].

• Se supone, además que b es un arreglo creciente, i.e., b[i]b[i+1], i0..n-1

Derivación de programas 11
La planicie
[Ctx: n:nat+  b[0..n-1]:int  b

i,p:= 1,1; lpml(i)  "longitud de la planicie


más larga en b[0..i-1]"
i=1,…,n
{Inv P: 0<in  p = lpml(i) }
{Cota t: n - i }

do i  n → if b[i] = b[i-p] → p:= p+1


[] b[i]  b[i-p] → skip
fi;
i:= i+1

od

T(n) = (n)
{Pos: p = lpml(n) } S(n) = (1)
]

Derivación de programas 12
La planicie no creciente
[Ctx: n:nat+  b[0..n-1]:int

i,p,q:= 1,1,1; lpml(i)  "longitud de la planicie


más larga en b[0..i-1]"
i=0,1,…,n
{Inv P: 0<in  p = lpml(i)  q = lpmlf(i) }
lpmlf(i)  "longitud de la planicie
{Cota t: n - i } más larga en b[0..i-1]
que termina en b[i-1]"
do i  n → if b[i] = b[i-1] → q:= q+1 i=0,1,…,n
[] b[i]  b[i-1] → q:= 1
fi;
if q > p → p:= q
[] q  p → skip
fi;
i:= i+1
od T(n) = (n)
{Pos: p = lpml(n) } S(n) = (1)
]
Derivación de programas 13
Cambiar variable dependiente por variable independiente

• Técnica emparentada con cambiar constante por variable

• Si la poscondición es de la forma
R(x,f(x))  xA  f(x)B

proponer
Inv P: R(x,y)  xA  yB

Derivación de programas 14
Raíz cuadrada entera
[Ctx: n:nat

a,b:= 0,n+1;

{Inv P3: a2  n < b2 }


{Cota t3: b–a-1 }

do b > a+1 → c:= (a+b)  2;


if c*c  n → a:= c
[] c*c > n → b:= c
fi
od

{R2: a2  n < (a+1)2 }

{R1: a  n < a+1 }


T(n) = (log n)
{Pos: a =  n  } S(n) = (1)
]

Derivación de programas 15
Aumentar el rango de una variable

• Si la poscondición tiene la forma


R[x]  xD

proponer un invariante de la forma


R[x]  xC  DC

La cota debería ser de la forma


t : dist(x,D)

Derivación de programas 16
Búsqueda con certeza
[Ctx: n:nat  b[0..n-1]:X  xb

i:= 0; iv = (min i| 0i<n  b[i]=x : i)

{Inv P: 0  i  iv }
{Cota t: iv-i }

do x  b[i] → i:= i+1 od

{R1: i = iv }

{Pos: x = b[i] }
]

T(n) = (n)
S(n) = (1)

Derivación de programas 17
Welfare crook

• Hay 3 archivos infinitos, f, g, h, ordenados ascendentemente


• Por ejemplo: archivos de nómina de empresas gigantes, ordenados por número de documento
de identidad

• Se sabe que hay un cruce entre los 3 archivos,


i.e., para ciertos índices i, j, k: f[i] = g[j] = h[k] = x

• Un x así es un "welfare crook". Se trata de determinar x, el individuo con documento de


identidad más pequeño que esté en los tres archivos

Derivación de programas 18
Welfare crook
[Ctx: f,g,h[0.. ]:nat  fgh
i,j,k:= 0,0,0; iv,jv,kv  índices mínimos en cada
{Inv P: 0iiv  0jjv  0kkv } archivo, para el primer crook
{Cota t: iv-i + jv-j + kv-k }
BB  f[i]g[j]  f[i]h[k] 
do f[i]<g[j]  f[i]<h[k] → i:= i+1 g[j]f[i]  g[j]h[k] 
[] g[j]<f[i]  g[j]<h[k] → j:= j+1 h[k]f[i]  h[k]g[j]
[] h[k]<f[i]  h[k]<g[j] → k:= k+1
od
BB  f[i] = g[j] = h[k]

{R1: i=iv  j=jv  k=kv }


x:= f[i];
{Pos: x = f[i] = g[j] = h[k] }
]

Derivación de programas 19
Welfare crook
[Ctx: f,g,h[0.. ]:nat  fgh
i,j,k:= 0,0,0;

{Inv P: 0iiv  0jjv  0kkv }


{Cota t: iv-i + jv-j + kv-k }

do f[i]<g[j] → i:= i+1


[] g[j]<h[k] → j:= j+1
[] h[k]<f[i] → k:= k+1
od

{R1: i=iv  j=jv  k=kv }


x:= f[i];
{Pos: x = f[i] = g[j] = h[k] }
]

Derivación de programas 20

También podría gustarte