Professional Documents
Culture Documents
No pretenden tener la profundidad de los creados por ejemplo por Jose Manuel Carillo
( sin los cuales yo no habría conseguido ni medio entender esta asignatura ) y mas son
un breve resumen, tocando solo las partes de creación de funciones recursivas e
iterativas, dejando en el tintero la conversión de recursivo a iterativo y sobre todo el
tema de coste de algoritmos, del que si consigo entender algo también haré un
resumencillo...
Lo que si he intentado es poner ejemplos de las demostraciones de los análisis por casos
y sobre todo de la verificación de funciones, que es lo que –aun sabiendo hacerlo de
manera mecánica – mas me costaba razonar y explicar, siendo esto parte fundamental en
el examen.
Como son bastante limitados ( no tenia intención ni de colgarlos, pero creo que pueden
ayudar para resolver alguna duda ) no tengo intención de ir ampliándolos ni nada así, así
que utilizar lo que os valga y lo que no pues ya sabéis que esta mal
1
ESQUEMA DE UNA FUNCION RECURSIVA LINEAL: Final y No Final
{Q≡(x)}
Fun f(x:T1) dev (y:T2)
caso Bt(x)->triv(x)
| Bnt(x)->c(f(s(x)),x)
Fcaso
Ffun
{R≡(x,y)}
2
- En el análisis por casos, como el caso trivial ya lo tenemos ( desarrollar que
tiene que devolverse en el caso trivial Bt: anulación del cuantificador, elemento
neutro, etc... )
Ejemplo: Si i=0 entonces s=∑α €{1..0}v[α] en este caso al anularse el rango
del sumatorio ( al ser sumatorio de un conjunto vació ) obtenemos 0, siendo
este el elemento neutro del sumatorio.
- Para calcular el caso Bnt realizaremos los siguiente pasos:
- Realizaremos una llamada recursiva pero con el tamaño del problema reducido.
- El resultado debe de cumplir la poscondición R y es la combinación de f(x)
y f(s(x))
f(v,i-1)=f(s(x))=s`=∑α €{1..i-1}v[α]
f(v,i)=f(v,i-1)+v[i]
por lo tanto cuando Bnt -> c(f(s(x),x)=f(v,i-i)+v[i] o s=s`+v[i]
o mas exacto:
s`=∑α €{1..i-1}v[α] ( llamada recursiva )
s=∑α €{1..i}v[α] (poscondición R)
para que s`=s le falta el termino v[i] osea s=s`+v[i] lo que satisfacerla la
poscondición, siendo esta la solución en el caso no trivial. Demostración:
s=v[1]+v[2]...v[i-1]+v[i] s`=v[1]+v[2]...+v[i-1]
esta claro que a s` le falta v[i] para ser s y satisfacer la poscondición.
- Definiremos la llamada inicial y la relación entre la original y la sumergida
isuma(v,N)=suma(v)
3
PLEGADO Y DESPLEGADO:
Nos permite convertir una función recursiva no final en recursiva final:
PASOS:
GENERALIZACION: Definimos una función generalizadora g(x,w) como
expresión dependiente de f(x) y en la que fijamos un valor de (w) para los cuales
g(x,w) se comporta como f(x)
v i-1 v i
Desplegamos:
Iisuma(v,i,r)= caso i=0 -> 0 +r
| i>0-> isuma(v,i-1)+v[i] +r
Reducimos:
Iisuma(v,i,r)= caso i=0 -> r
| i>0-> isuma(v,i-1)+(v[i]+r)
Plegamos:
Iisuma(v,i,r)= caso i=0 -> r
| i>0-> iisuma(v,i-1,v[i]+r)
4
CORRECCION DE PROGRAMAS RECURSIVOS:
EJEMPLO FINAL:
{Q≡ (0<=i<=N) ^(r=∑α €{i+1..N}v[α])} Bnt=i>0 {Q(s(x)) ≡ (0<=i-1<=N) ^(r=∑α €{i..N}v[α])}
Sustituimos:
(0<=i<=N) ^(r=∑α €{i+1..N}v[α]) ^ i>0 =>(0<=i-1<=N) ^(r=∑α €{i..N}v[α])
5
3) BASE DE INDUCCION: Q(x) ^ Bt(x) =>R(x,triv(x))
Se trata de comprobar que en el caso trivial el predicado R nos devolvera el valor
fijado como trivial y se cumple la poscondición
EJEMPLO NO FINAL:
{Q≡ (0<=i<=N) } Bt=i=0 {R≡s=∑α €{1..i}v[α] }
(0<=i<=N) ^ i=0 => s=∑α €{1..0}v[α]
Cuando i=0 -> 0
Cuando i=0 R≡s=∑α €{1..0}v[α]=0 ya que se anula el rango del cuantificador.
EJEMPLO FINAL:
{Q≡ (0<=i<=N) ^(r=∑α €{i+1..N}v[α]) Bt=i=0 {R≡s=∑α €{1..i}v[α] }
(0<=i<=N) ^(r=∑α €{i+1..N}v[α]) ^ i=0 => s=∑α €{1..i}v[α]
Esta claro que r=∑α €{0+1..N}v[α])=>s=∑α €{1..i}v[α]
Quedando que r=s devolviendo r en el caso trivial que es s
EJEMPLO NO FINAL:
Q(x)≡ (0<=i<=N) 1
Bnt(x) ≡ (i<0) 2
R(s(x),y) ≡s`=∑α €{1..i-1}v[α] 3
c(y,x)=s`+v[i]
R≡s=∑α €{1..i}v[α]
EJEMPLO FINAL:
En este caso prácticamente no hay nada que comprobar debido a que llamada
interna devuelve directamente y`que cumple la poscondición R ya que no se
realiza la funcion “combinación” adicional. O la manera elegante de decirlo:
SI POR HIPOTESIS DE INDUCION SE CUMPLE R(s(x,y)) AL NO EXISTIR
OPERACIÓN ADICIONAL SE CUMPLE LA POSCONDICION
6
5) ELEGIR UNA EXTRUCTURA DE PBF: Q(x)=>h(x)>=0
Se trata de encontrar una función de los parámetros de entrada en los enteros no
negativos. Como el pbf mas conocido es el de los números naturales, muchas veces
es posible dotar a un conjunto de una relación de pbf estableciendo una aplicación
en el conjunto de los naturales N.
EJEMPLO en i decreciente:
Si Q(x)=0<=i<=N podemos elegir h(x)=i o sea h(v,i) estando claro que para
cualquiera de los i aceptados por Q se cumple que i>=0
EJEMPLO en i creciente:
Si Q(x)=0<=i<=N e i va en incremento podemos elegir h(x)=N-i, o sea
h(v,i,r)=N-i cumpliéndose N-i>=0
EJEMPLO en i decreciente:
(0<=i<=N) ^i>0 =>h(v,i-1)<h(v,i)
Siendo h(x)=i y h(s(x))=i-1 esta claro que i-1<i
EJEMPLO en i creciente:
(0<=i<=N) ^ i<N=>h(v,i+1)<h(v,i)
Habiendo fijado en el punto anterior h=N-i y siendo h(s(x))=N-1-i esta claro
que N-1-i<N-i
7
DISEÑO ITERATIVO DE PROGRAMAS
La otra variante de diseño que nos encontramos es el diseño iterativo. Una función
iterativa puede tener instrucciones condicionales, de asignación, etc..., pero su esquema
básico en la mayoría de los ejemplos y exámenes consta de una asignación de variables,
un bucle, una secuencia “avanzar”, una secuencia “restablecer” y su esquema básico es
el siguiente:
{Q} {Q≡cierto}
Inic; fun sumait(v:vector[1..N] de ent) dev (s:ent)
mientras B hacer {P} var i: nat,s:ent fvar
S <s,i>:=<0,0>
Fmientras mientras i≠N hacer {P≡s=∑α€{1..i}· v[α])}
{R} s:=s+v[i+1]; // restablecer
i:=i+1; // avanzar
fmientras
dev s
ffun
{R≡s=∑α€{1..N}· v[α]}
INSTRUCCIONES BASICAS
INSTRUCCIONES CONDICIONALES
Para garantizar además que si termina lo haga en P^¬B, tenemos que encontrar una
Función Limitadora que asegure que efectivamente termina el bucle ( normalmente
nos basaremos en B para encontrarla ) y la usaremos luego en la verificación formal de
la función que hemos desarrollado. Debemos construir una función t que decrezca y
además que se mantenga no negativa mientras se den P^B
8
DERIVACION DE BUCLES:
Ejemplo de restablecer:
Si avanzar es i:=i+1 y sabemos que P≡s=∑α€{1..i}· v[α] entonces
s `,i +1
sustituyendo valores:{P^B}=> P s ,i 1
Si s=∑α€{1..i}· v[α] entonces s`=∑α€{1..i+1}· v[α]
Despejando s` vemos: s`=∑α€{1..i+1}· v[α] => s`=∑α€{1..i}· v[α]+ v[α+1]
s
Por lo tanto vemos que s`=s+v[α+1] y por lo tanto sabemos que la
operación restablecer ha de ser s:= s+v[α+1] y con ello garantizamos la
invarianza en la siguiente ejecución del bucle o a la salida de el si se diera
¬B tal y como nos pide la poscondición.
1
Este simbolito indica que el valor de abajo se sustituye por el de arriba, en el ejemplo s=s` e i=i+1.
Conociendo s y conociendo i y conociendo i+1, comprobamos, verificamos u obtenemos s`
9
VERIFICACION FORMAL DE FUNCIONES ITERATIVAS:
Igual que se realizo en el diseño recursivo, debemos demostrar que se cumplen ciertas
condiciones para garantizar el funcionamiento de nuestras funciones iterativas.
Realizaremos 5 pasos ( más uno previo de preparación ).
10