Especificaciones, Verificaciones y Derivaciones
Construcción de programas y paradigmas
El proceso de construcción de programas se establece de la siguiente forma:
Problema
(Impreciso/Informal, poco detallado)
⇓
Especificación
(Preciso/Formal, poco detallado)
⇙
Derivación
(Crear la definición)
⇘
⇖
Verificación
(Demostrar su validez)
⇗
Programa
(Preciso/Formal, detallado)
La programación funcional, se basa en la definición de funciones y el cálculo/reducción de expresiones.
Podemos resolver problemas a través de funciones, y las especificaciones tendrán la siguiente estructura:
- 1) Nombre de la función
- 2) Tipo de la función (Input / Output)
- 3) Predicado que indica qué debe satisfacer la función.
Ejemplo: quisiera saber si un número es impar
- 1)
- 2)
- 3)
Nuestro programa sería:
Y también podemos definirlo en Haskell:
esImpar :: Int -> Bool
esImpar x = mod x 2 /= 0
Especificaciones (PF)
Suponiendo que sabemos la definición de un programa dado:
Por la definición de la función, podemos escribir una especificación mediante una expresión cuantificada:
Ya tenemos una una descripción formal de la tarea que el programa tiene que realizar
Derivaciones (PF)
Podemos no disponer de la definición de la función, pero sí de una especificación. En este caso, podemos derivar la definición de la función a partir de la especificación.
Por ejemplo, para encontrar el programa de la función a partir de la especificación:
Caso base (cuanto vale )
Por lo tanto,
Paso inductivo (cuanto vale )
Por lo tanto,
El programa sería:
Podemos recurrir a otras técnicas para derivar, estas se encuentran más abajo.
Ejercicios - Derivaciones (PF)
1.
Derivar la función a partir de la especificación (donde es una función que devuelve el producto de los elementos de una lista):
Comenzando por la especificación, evaluamos el caso base, :
Por lo tanto,
Para el Paso inductivo, seguimos con :
Por lo tanto,
Análisis por casos (PF)
Supongamos que nuestro programa tiene la siguiente especificación:
Y en nuestro paso inductivo llegamos a la siguiente expresión:
Observemos que la expresión puede ser verdadera o falsa, por lo que debemos analizar ambos casos:
Caso 1:
Caso 2:
Nuestra definición final sería:
Modularización (PF)
Supongamos que nuestro programa tiene la siguiente especificación:
Y en nuestro paso inductivo llegamos a la siguiente expresión:
La expresión tiene sentido en el lenguaje de la matemática, no de los programas.
Podemos modularizar la expresión derivando otra función tal que:
Tras derivarla obtenemos:
Y podemos reemplazar la expresión en nuestra definición:
Generalización (PF)
Supongamos que nuestro programa tiene la siguiente especificación:
Al seguir en el paso inductivo , llegamos a la siguiente expresión:
No aplicar nuestra Hipótesis Inductiva, ya que tenemos:
Podemos generalizar definiendo una nueva función , de forma tal que:
Podemos decir que , ya que:
Una vez derivado , tendremos dos programas finales:
Esquemas de Inducción
En algunos casos los esquemas inductivos convencionales no son los necesarios para derivar.
En el caso de la inducción con naturales, tenemos:
Inducción Básica:
Inducción a lo Fibonacci:
En el caso de la inducción con listas, tenemos:
Inducción básica: (, , etc.)
Inducción con dos o más elementos: (funciones , y )
Ejemplo:
Si derivamos y el caso base es , tendremos como resultado .
Necesitamos reemplazar el caso base por y el Paso inductivo por .
Segmentos de listas
Podemos buscar un segmento inicial de una lista derivando la siguiente especificación.
Para derivarlo, nuestro esquema inductivo debe ser el siguiente:
Caso Base 1: ()
Caso Base 2: ()
Paso Inductivo: ()
Verificación (PF)
Podemos demostrar que
Cumple con:
Para lograrlo podemos utilizar inducción matemática o inducción estructural sobre listas (en este caso, la segunda):
Caso base: ()
Debemos demostrar que:
Para ello podemos comenzar del lado derecho:
Por lo tanto, probamos la propiedad
Paso inductivo: ()
Debemos demostrar que:
Donde es la hipótesis inductiva.
Para ello podemos comenzar del lado derecho:
Por lo tanto, probamos la propiedad , y su validez en cualquier lista.