0% encontró este documento útil (0 votos)
53 vistas17 páginas

Especificación de Algoritmos Imperativos

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
53 vistas17 páginas

Especificación de Algoritmos Imperativos

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Análisis y Diseño de Algoritmos

Tema 2: Especificación de Programas


Imperativos
Contenido

• Especificación vs Implementación
• Especificación formal: Motivación
• Especificación pre/post
• Predicados lógicos
• Semántica
• Especificación de predicados
• Especificación de problemas

2
Especificación vs Implementación

• La especificación de un algoritmo es la descripción de qué es lo que


hace y bajo qué condiciones lo hace
• La implementación de un algoritmo es la descripción de la
secuencia de instrucciones que hacen que la especificación se
satisfaga. (cómo)
• La especificación de un algoritmo es un paso necesario para su
implementación correcta.
• Una especificación precisa descrita en un lenguaje lógico
matemático permite la demostración de que el algoritmo
implementado satisface la especificación (verificación)
Especificación Implementación
Verificación
3
Especificación vs Implementación

Especificación pre/post Implementación

4
Especificación formal: motivación

• Una posible implementación sería


{a  0, b>0} a = 5, b =2
(1) int q = 0;
(3) a = 5, b =2, q = 0, r = 5
(2) int r = a;
(3) while (r > b){ (4) a = 5, b =2, q = 0, r = 5
Estados
(4) r = r - b; del programa
(5) a = 5, b =2, q = 0, r = 3
(5) q++;
} (3) a = 5, b =2, q = 1, r = 3
{a = qb + r} (4) a = 5, b =2, q = 1, r = 3

(5) a = 5, b =2, q = 1, r = 1
¿Se nos ocurre alguna otra forma (3) a = 5, b =2, q = 2, r = 1
de cumplir la especificación con
a = 5, b =2, q = 2, r = 1
una implementación distinta?

5
Especificación formal: motivación

{a  0, b>0} a = 6, b =2
(1) int q = 0;
(3) a = 6, b =2, q = 0, r = 6
(2) int r = a;
(3) while (r > b){ (4) a = 6, b =2, q = 0, r = 6
(4) r = r - b;
(5) a = 6, b =2, q = 0, r = 4
(5) q++;
} (3) a = 6, b =2, q = 1, r = 4
{a = qb + r} (4) a = 6, b =2, q = 1, r = 4

(5) a = 6, b =2, q = 1, r = 2

(3) a = 6, b =2, q = 2, r = 2
La división no
está bien calculada a = 6, b =2, q = 2, r = 2 ???

6
Especificación formal: motivación
a = 6, b =2

(3) a = 6, b =2, q = 0, r = 6
{a  0, b>0}
(1) int q = 0; (4) a = 6, b =2, q = 0, r = 6
(2) int r = a; (5) a = 6, b =2, q = 0, r = 4
(3) while (r >= b){
(4) r = r - b; (3) a = 6, b =2, q = 1, r = 4
(5) q++; (4) a = 6, b =2, q = 1, r = 4
}
(5) a = 6, b =2, q = 1, r = 2
{a = qb + r, r < b}
(3) a = 6, b =2, q = 2, r = 2
Modificamos el aserto (4) a = 6, b =2, q = 2, r = 2
(postcondición).
(5) a = 6, b =2, q = 2, r = 0

(3) a = 6, b =2, q = 3, r = 0

a = 6, b =2, q = 3, r = 0
7
Especificación formal: motivación

{a  0, b>0}
(1) int q = 0;
(2) int r = a; Si hubiéramos especificado
(3) while (r >= b){ correctamente el resultado,
(4) r = r - b; seguramente el código se
habría implementado
(5) q++;
correctamente desde el
} principio
{a = qb + r, r < b}

¿Funciona este algoritmo para una precondición distinta?

8
Especificación pre/post

a = 5, b =2

{a  0, b>0} a = 5, b =2, q = 0, r = 5
(1) int q = 0; a = 5, b =2, q = 0, r = 5
(2) int r = a; Estados del programa
a = 5, b =2, q = 0, r = 3
(3) while (r >= b){
a = 5, b =2, q = 1, r = 3
(4) r = r - b;
(5) q++; a = 5, b =2, q = 1, r = 3
} a = 5, b =2, q = 1, r = 1
{a = qb + r,r < b} a = 5, b =2, q = 2, r = 1

a = 5, b =2, q = 2, r = 1

La ejecución de un programa puede definirse como una secuencia de estados

9
Especificación pre/post

a = 5, b =2

{a  0, b>0} a = 5, b =2, q = 0, r = 5
(1) int q = 0; a = 5, b =2, q = 0, r = 5
Asertos
(2) int r = a;
a = 5, b =2, q = 0, r = 3
(3) while (r >= b){
a = 5, b =2, q = 1, r = 3
(4) r = r - b;
(5) q++; a = 5, b =2, q = 1, r = 3
} a = 5, b =2, q = 1, r = 1
{a = qb + r,r < b} a = 5, b =2, q = 2, r = 1

a = 5, b =2, q = 2, r = 1

10
Especificación pre/post

11
Predicados lógicos

12
Semántica

13
Especificación de problemas

14
Especificación de problemas
/**
* @param a array arbitrario
* @return max el mayor valor
*/

/ / pre{[Link] > 0}
int maximo(int[] a)

/ / post{$0 £ j < [Link] : (max = a[ j], "0 £ i < [Link] : a[ j] ³ a[i])

/**
* @param a array arbitrario
* @return b = true, si alguna de sus componentes es igual a la suma
* de las que la preceden, o b = false, en otro caso
*/

/ / pre{[Link] > 0}
boolean suma(int[] a)
j-1
/ / post{b = ($0 £ j < [Link] : (a[ j] = å a[i]))}
i=0

15
Referencias

• Diseño de Programas: Formalismo y Abstracción.


R. Peña. Ed. Prentice-Hall
• The Science of Programming. D. Gries. Ed.
Springer-Verlag

16
En Java
/**
* Devuelve un BigInteger cuyo valor es él mismo a la inversa modulo m
* @param m el módulo.
* @throws ArithmeticException si m <= 0
*/
public BigInteger modInverse(BigInteger m) {
if ([Link] <= 0)Q
throw new ArithmeticException("Modulus not positive:“+m);
// Secuencia de instrucciones que calcula el resultado en la
//variable result
assert [Link](result).mod(m).equals(ONE) : this;
return result; R
}

17

También podría gustarte