![]() |
Haga click para publicitar en Alipso.com |
| Buscando Secundarios
| Universidades
| Carreras
| Test
Orientación Vocacional | Medios
| Profesores particulares
| Institutos
| Campus Material Monografias | Exámenes Secundarios | Exámenes Universitarios | Enlaces | Enviar material | Diversión Postales | Humor | Descargas | Juegos Comunidad Foros | Institucional Publicite | En su sitio | Contáctese Cursos en Buenos Aires Cursos de Informática | Cursos de apoyo al CBC | Carreras y Cursos de Diseño, Comunicación, Arte y Fotografía |
|
|
Imprimir apunte |
Recomendar a un amigo |
Recordarme el recurso |
|
Más sobre este recurso: Catalogado en base de datos como: Clase de Práctica AED1: Recursión. Especificación de estados. Código. Programación de computadoras. Correctitud del ciclo. Programa. Metavariables. Agregado: 17 de JULIO de 2003 (Por Michel Mosse) | Palabras: 1052 | Votar! | Sin Votos | Sin comentarios | Agregar Comentario Categoría: Apuntes y Monografías > Computación > Programación > |
Ejercicio 2i.
Potencia(n:integer,m:integer):integer
P º {n = N0 Ù m = M0 Ù (N0 = 0 Þ M0 ¹ 0) Ù M0 ³ 0}
definimos: Pposº { N0 ¹
0 Ù
M0 ³ 0 Ù n = N0 Ù m = M0 }
Pc º {i = 0 Ù ret_value = 1 Ù Ppos }
B º {i < m}
I º {ret_value = f_potencia n i Ù 0 £ i £ m Ù Ppos }
Fv = m - i
Qc º { ret_value = f_potencia n m Ù i=m Ù Ppos }
Q º {ret_value = f_potencia N0
M0}
Function Potencia(n:Integer,m:Integer):Integer;
i:integer;
if (n<>0) then
i=0;
ret_value:=1;
{ Pc }
ß
{ I }
while (i<m) do
{ I Ù B }
ret_value:=ret_value*n;
i:=i+1;
{ I }
od;
{ I Ù ~B }
ß
else
ret_value:=0;
fi
ß
EndFunction;
Es importante demostrar que el ciclo fue especificado y codificado correctamente.
Lo que nos interesa es que partiendo de nuestra precondición del ciclo (Pc), ejecutando una serie de iteraciones podamos alcanzar la postcondición del ciclo (Qc) y que el mismo, en este caso implique la postcondición de la función (ya que luego del ciclo no realizamos ninguna operación más).
Para cumplimentar estos requisitos es necesario que el invariante verifique estas propiedades:
Verifiquemos que si nuestro código cumple con estas propiedades.
Pcº{i = 0 Ù ret_value = 1 Ù Ppos}
siendo
nuestro invariante es el siguiente:
I º {ret_value = f_potencia n i Ù 0 £ i £ m Ù Ppos }
Reemplazando a i por 0
y ret_value por 1 obtenemos:
{1 = f_potencia n 0 Ù 0 £ 0 £ m Ù Ppos }
º True
ya que n0 = 1 (n¹0) por lo que se cumple la primera conjunción,
se sigue cumpliendo Ppos ya que no cambiamos el valor de n
y m y por Ppos
sabemos que m= M0 ³ 0 por lo que también se cumple la
segunda conjunción.
Como I y B se
cumplen podemos caracterizar al
conjunto de estados posibles con el siguiente predicado.
P1º { I Ù B } º {i<m Ù ret_value = f_potencia n i Ù 0 £ i £ m Ù Ppos }
Ahora llamemos i0
y ret_value0 a los valores de la variables i y ret_value en este momento de ejecución. i0 y ret_value0
son un ejemplo de metavariables que son usadas solamente en la descripción de
estados para referirnos al valor de las variables en algún momento de la
ejecución.
Debe quedar claro que las
metavariables bajo ninguna circunstancia deben ser usadas en las sentencias de
un programa.
Nuestro predicado anterior puede
rescribirse de la siguiente manera:
E1 º {i0<m Ù i=i0
Ù ret_value = ret_value0 Ù ret_value0 = f_potencia
n i0
Ù 0 £ i0 £ m Ù Ppos }
Hasta el momento, solo hemos
reescrito de manera conveniente nuestro predicado
I
Ù B. Ahora sigamos paso a paso la ejecución de las
sentencias del ciclo.
while (i<m) do
E1 º{i0<m Ù i=i0 Ù ret_value = ret_value0 Ù ret_value0 = f_potencia
n i0 Ù 0 £ i0 £ m Ù Ppos }
ret_value:=ret_value*n
E2 º{i0<m Ù i=i0 Ù ret_value = ret_value0
*n Ù ret_value0 = f_potencia
n i0
Ù 0 £ i0 £ m Ù Ppos }
º (reemplazando el valor de
ret_value0)
E2’ º{i0<m Ù i=i0 Ù ret_value = f_potencia n i0 *n Ù 0 £ i0 £ m Ù Ppos }
i:=i+1;
E3 º {i = i0+1 Ù i0<m Ù ret_value = f_potencia n i0*n i0 Ù 0 £ i0 £ m Ù Ppos }
ß?
{ I }
od;
Solo nos resta demostrar que E3 Þ I. Pero esto es simple ya que:
·
Como i0 < m Ù 0 £ i0 £ m Þ 0 £ i = i0+1 £ m
·
ret_value
= f_potencia n i0 *n =
f_potencia n (i0+1) = f_potencia n i
luego se cumple I como
queríamos demostrar.
La función variante es m-i. Llamemos fv0=m-i0
al valor que representa la función variante en una iteración del ciclo.
Luego de ejecutar i:=i+1, fv = m- (i0+1)=
m - i0- 1= fv0 –1 por lo que queda demostrado que decrece
un paso en cada iteración
Es muy simple ver que está acotada en 0, ya que m=M0 para
todas las iteraciones y el ciclo incrementa i hasta alcanzar a m.
Sabemos que i³m ya que ha terminado el ciclo y además se cumple el invariante. Por lo tanto nuestro estado está caracterizado por el siguiente predicado
{ I
Ù ~B } º {i³m Ù ret_value = f_potencia n i Ù 0 £ i £ m Ù Ppos }
Debido a la restricción que impone I
sobre i esta necesariamente deberá ser igual a m.
{i=m Ù ret_value = f_potencia n i Ù Ppos} º {i=m Ù ret_value = f_potencia n m Ù Ppos }
º
Por Ppos sabemos que n=N0
y m=M0 por lo tanto lo reemplazamos y obtenemos
{i=m Ù ret_value = f_potencia N0
M0 Ù Ppos }
ß
{ ret_value = f_potencia N0 M0 } como queríamos demostrar.
| ||||
| X | ||||