|
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.
Aún no hay comentarios para este recurso.
Monografias, Exámenes, Universidades, Terciarios, Carreras, Cursos, Donde Estudiar, Que Estudiar y más: Desde 1999 brindamos a los estudiantes y docentes un lugar para publicar contenido educativo y nutrirse del conocimiento.
Contacto »