Você está na página 1de 11

3.

3 Especificacin formal de la funcin sink (trabajo del alumno) Escrbase en este espacio, la especificacin de la funcin sink: {Q (x )}
fun sink (x: real; k: nat) dev (sinx: real)

{Rsinx=

4. DISEO RECURSIVO DE SINK. 4.2. Expresin de sink respecto a tmno. A continuacin, debe expresarse sink en funcin de tmno. Debe tenerse cuidado con la eleccin adecuada de los parmetros con los que se llame a cada funcin para que esta expresin represente el desarrollo en serie de potencias de Taylor que apareca en la ecuacin en la pgina 7: {Q (x )}
fun sink (x: real; k: nat) dev (sinx: real)

{Rsinx=

4.6. Anlisis por casos de la funcin sink (trabajo del alumno) Escrbase aqu el anlisis por casos de la funcin sink, junto con el proceso de su obtencin: En la precondicin, vemos que el valor que vara en la funcin es k. El caso trivial es k=0. Demostraremos que efectivamente ste es el caso trivial:

sink(x,0) =

En cuanto al caso no trivial, ste sera cuando k>0 y devolvera la llamada de la funcin sink del parmetro anterior en combinacin de la potencia y factorial de k. En conclusin, sera:

sink(x, k-1) + pot(-1,k) * tmno(x,2*k+1)


En este caso no trivial, observamos que el valor de depende del valor de k, de tal manera que cambiar el signo en funcin de la paridad de k. Para arreglarlo he recurrido a la opcin de considerar los casos par e impar segn esta frmula:

1 2*(k mod 2)

4.7. Composicin algortmica (trabajo del alumno) La composicin algortmica no es ms que la expresin, utilizando una sintaxis algortmica, del trabajo que hemos realizado hasta el momento, es decir, la especificacin formal y el anlisis por casos. En ella deben, pues, incluirse la precondicin, la declaracin o cabecera de la funcin, la alternativa de las protecciones con sus resultados dada por el anlisis por casos, y la postcondicin. La composicin algortmica, que estamos a punto de escribir, constituye el cdigo de la funcin. En el espacio siguiente transcrbase la composicin algortmica de la funcin sink: {Q (x )}
fun sink (x: real; k: nat) dev (sinx: real) caso k=0 -- sinx= x caso k>0 -- sinx= sink(x, k-1) + pot(-1, k) * tmno(x, 2*k+1)

fcaso ffun {Rsinx=

4.8. Verificacin formal de la correccin. 4.8.1. Completitud de la alternativa (trabajo del alumno). Cmo la funcin ha de estar bien definida en su dominio, hay que demostrar que el conjunto de protecciones que hemos obtenido en el anlisis cubre todos los casos posibles para los datos de entrega recogidos en la precondicin. Es decir, demostrar que Q(x) , que es el siguiente trabajo a llevar a cabo. En el siguiente espacio, verifquese la completitud de la alternativa: Q(x) Q (x ) k = 0 k > 0 Sustituyendo en la expresin, vemos que: (x ) (k = 0) k > 0)

Observamos que se cumple para todos los casos de k. Por tanto, se verifica la completitud de la alternativa.

4.8.2. Satisfaccin de la precondicin para la llamada interna (trabajo del alumno). La funcin ha de invocarse siempre en estados que satisfagan su precondicin, o sea, hay que demostrar que Q(x) Q(s(x)). Tenemos las siguientes expresiones, tal como lo hicimos antes. En este caso nos piden un sucesor del parmetro k, que como vimos antes era k-1. Quedara as: Q(x) Q(s(x))

Q (x ) k > 0 s(x) k-1 Q(s(x)) (x ) (k-10) = (x ) (x ) (k >0) Q(x) Por tanto, queda demostrado que la implicacin es cierta. (k 1) =

4.8.3. Base de la induccin (trabajo del alumno). Ha de demostrarse la satisfaccin de la postcondicin para los casos triviales, o sea, Q(x) R(x, triv(x)). En el espacio siguiente, demustrese que se alcanza la postcondicin mediante los casos triviales: Q(x) R(x, triv(x))

Q (x ) k = 0 Q(x) (x ) R(x, triv(x))

(k = 0)

Al resolver esta expresin, llegamos a la conclusin de que es igual a x, valor resultante en el caso trivial. (x ) (k = 0) x cierto. Se cumple la base de induccin.

4.8.4. Paso de induccin (trabajo del alumno). Hay que probar que se satisface la postcondicin para los casos recursivos, a partir de la hiptesis de induccin, esto es, de la suposicin de la satisfaccin de dicha postcondicin para los datos de la llamada interna. Formalmente, hay que demostrar que Q(x) R(s(x),y) R(x, c(y,x)).

Q(x) Q(x) s(x) k-1 y= Q(x) C(y,x) = R(x, c(y,x)) sinx =

R(s(x),y) (x )

R(x, c(y,x)) (k >0)

R(s(x),y) (x ) +

(k >0)

(sinx=

+ sinx +

Demostramos, por tanto, que se cumple el paso de induccin.

4.8.5. Eleccin de una estructura de preorden bien fundado (trabajo del alumno). Hay que demostrar t: Z tal que Q(x) t(x) 0 En el espacio siguiente, propngase una estructura de preorden bien fundado a partir de los datos de las llamadas recursivas: Q (x ) t(x) k (ser la cota superior de las llamadas recursivas) Q(x) t(x) 0 k0

(x )

Observamos que el rango de valores es siempre finito, de 0 hasta k, lo que forma un preorden bien fundado.

4.8.6. Demostracin del decrecimiento de los datos (trabajo del alumno). En ese preorden, para las sucesivas llamadas recursivas. Esto equivale a demostrar que Q(x) . En el espacio siguiente, demustrese que los datos de cada llamada recursiva decrecen en el preorden bien fundado elegido anteriormente: Q(x) T(s(x)) = k-1 T(x) = k (x ) (k >0) k-1 < k Se cumple el decrecimiento de los datos

4.9 Estudio del coste del algoritmo (trabajo del alumno). Podemos asumir que los costes de pot y fact son T(pot(x,n)) O(n) y T(fact(n)) O(n). En el espacio siguiente, debe calcularse el coste de la funcin sink mediante la recurrencia adecuada: Veamos que se trata de una recurrencia de reduccin del problema mediante sustraccin. Aplicamos la formula con las posibles soluciones:

T(n)

En nuestro caso, a=1, por tanto, el coste es O( El coste es T(n) O( ).

5. Optimizacin del diseo recursivo. 5.1. Transcripcin del cdigo de tmno a sink (trabajo del alumno) El primer paso ser reescribir el cdigo de sink substituyendo, donde corresponda, la llamada a tmno por una expresin utilizando directamente las funciones pot y fact, lo que debe hacerse en el siguiente espacio reservado. Ntese que la funcin obtenida es correcta por construccin. {Q (x )}
fun sink (x: real; k: nat) dev (sinx: real) caso k=0 -- sinx= x k>0 -- sinx= sink(x, k-1) + pot(-1, k) *

fcaso ffun {Rsinx=

5.2. Inmersin de parmetros de la funcin sink (trabajo del alumno) El trabajo que hay que realizar ahora consiste en encontrar expresiones que permitan calcular cada trmino de la serie en funcin de los anteriores y de los nuevos parmetros, que llevarn el valor en curso de (en p) y de (2n+1)! (en f).

Podemos observar que desde el paso k, que es el valor mximo de la precondicin, a k-1 hay un cambio de valores. Tenemos que p = pot(x, 2k+1) y f = (2k+1)! fact(2k+1)

Veamos que ocurre para (k-1): La relacin existente entre k y k-1 es:

Por tanto, la deduccin de k a k-1 ser la siguiente: (atencin, que vamos a pasar de un miembro a otro)

5.3. Especificacin de la funcin inmersora isink (trabajo del alumno) Ahora hay que integrar las anteriores expresiones en una nueva especificacin: la de la funcin que sumerge a sink. Adems de esto, en el espacio reservado a continuacin, se deben dar los valores adecuados para la llamada inicial a isink en funcin de sink. Especificaremos la funcin inmersora dependiendo de la parida de k, segn la forma:

(1-2*(k mod 2)) * p/f + isink(x, k-1, p/

, f/

))

La llamada inicial sera: sink = isink(x,k,x,1) ya que para k=0 p = x y f = 1.

5.4. Cdigo de la funcin inmersora: inmersin de eficiencia (trabajo del alumno) Se trata de proponer un cdigo recursivo que calcule la aproximacin al seno mediante el desarrollo en serie de Taylor pero esta vez, apoyndonos en los parmetros acumuladores que hemos introducido en la especificacin de la nueva funcin inmersora para reducir el coste asociado a cada llamada recursiva. Es importante tener en cuenta tanto la especificacin anterior como los valores iniciales encontrados para esos parmetros.

{Q (x )
fun sink (x: real; k: nat; p: real; f:nat) dev (isinx: real) caso k=0 k>0 x=0 isinx= x isinx= (1-2*(k mod 2)) * p/f + isink(x, k-1, p/ , f/

))

fcaso ffun {Risinx=

5.5. Coste de la funcin inmersora Llegados a este punto, interesa saber cual es la ganancia en el uso de recursos que hemos conseguido con esta inmersin de eficiencia. Para ello, en el siguiente espacio reservado, hay que plantear y resolver la correspondiente ecuacin de recurrencias para isink. K=0 K=1 K=2 . . . K=n isink(x,k) = isink(x,k-1) + p/f * (1-2*(k mod 2)) isink(x,k) = isink(x,k-1) + 2*p/f * (1-2*(k mod 2)) isink(x,k) = isink(x,k-1) + 3*p/f * (1-2*(k mod 2))

isink(x,k) = (n+1)* p/f * (1-2*(k mod 2)) T(isink(x,k))O(n+1)~O(n)

6. Transformacin a recursive final: Desplegado plegado 6.1. rbol sintctico de la funcin recursiva Dibjese el rbol sintctico de la llamada recursiva interior de la funcin no final isink (rama del caso no trivial) +

(1-2*(k mod 2))*p/f

isink

p/

f/

6.2. Substituciones aplicadas (trabajo del alumno) Aplquense las substituciones pertinentes segn la heurstica de Kodratoff. +

isink

6.3 Desplegado y plegado. Llamada inicial (trabajo del alumno) Para poder aplicar la tcnica de desplegado-plegado, la funcin c (combinar) ha de poseer elemento neutro y ser asociativa. La generalizacin de la funcin iisink ser: iisink(x,k,p,f,u) = isink(x,k,p,f) + u Vemos que se cumple el elemento neutro como sigue: iisink(x,k,p,f,0) = isink(x,k,p,f) 1 paso: Partiendo de la igualdad antes citada desarrollamos la misma y sumamos a cada caso el nuevo parmetro acumulador: Caso
2 paso:

(k=0) (x=0) x + u (k>0) (1-2*(k mod 2)) * p/f + isink(x, k-1, p/ , f/

))+u

Caso

(k=0) (x=0) x + u (k>0) (1-2*(k mod 2)) * p/f + u + isink(x, k-1, p/ , f/

))

Plegamos la expresin y quedara como sigue: 3 paso:

Caso

(k=0) (x=0) x + u (k>0) iisink(x, k-1, p/ , f/

) , (1-2*(k mod 2)) * p/f + u )

Vamos a aumentar el rango de valores de k. En la nueva precondicin , k va a ir de 0 a N. Entonces tendremos que completar los valores restantes hasta llegar a N tal y como sigue:

Veamos que para que u satisfaga las condiciones de dominio, tendr que ser as:

u=
precondicin nueva.

, que ser la condicin a agregar en la

La llamada inicial ser: iisink(x,k,p,f,0.0) = isink(x,k,p,f)

6.4. Cdigo de la funcin recursiva final (trabajo del alumno) Y por fin, aqu se debe transcribir el cdigo de la funcin recursiva final iisink, completo con la precondicin y la postcondicin. {Q (x ) }
fun iisink (x: real; k: nat; p, u: real; f:nat) dev (iisinx: real) caso k=0 x=0 x + u k>0 iisink(x, k-1, p/

, f/

) , (1-2*(k mod 2)) * p/f + u )

fcaso ffun {Riisinx=

7. Diseo iterativo de sinkit. 7.2. Derivacin del invariante desde la postcondicin Escrbase aqu el invariante del bucle, junto con las explicaciones necesarias para explicar su derivacin formal, asi como la proteccin de dicho bucle (su condicin de terminacin) y las explicaciones pertinentes sobre la misma. (Se puede debilitar la postcondicion.) El primer paso es derivar el invariante desde la postcondicin, para ello debilitamos la misma: {R ( k = N) Cumpliremos P B R {P

Por tanto, la proteccin del bucle es B k N) El invariante ser P.

7.2. Inicializacin del bucle (trabajo del alumno) Dervese a continuacin, la inicializacin del bucle y explquense los argumentos pertinentes para comprobar la invarianza del mismo. Calculamos la instruccin Inicializar: Var p,f,u: real; fvar; < p, f, u > := <

7.4. Instruccin avanzar del bucle Calculamos la instruccin avanzar: k := k-1;

7.5. Restablecimiento del invariante Dervese aqu la instruccin restablecer. (Recuerdese la relacin que haba entre k y k-1) < p, f, u > := < p/ , f/
) , (1-2*(k mod 2)) * p/f + u >

7.6. Cdigo del algoritmo iterativo (trabajo del alumno)

{Q (x )

fun sinkit (x: real; k: nat) dev (sink-it: real) var p,f,u: real; fvar;

< p, f, u > := < mientras k > 0 hacer


< u, p, f > := < (1-2*(k mod 2)) * p/f + u, p/ k: k-1; fmientras; dev (u + x); , f/ )>

ffun {Rsink-it =

7.7 Estudio del coste (trabajo del alumno) En este apartado deber escribirse la funcin de cota del bucle y el coste del algoritmo iterativo obtenido en el apartado anterior. Coste: T(k) O(k+1) ~ O(k) La funcin de cota ser: t = k

Você também pode gostar