Programas Funcionales
Especificaciones (PF)
Suponiendo que sabemos la definición de un programa dado:
Por la definición de la función o por el problema que se nos plantea, 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.
Análisis por casos
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
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
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: ()
Ejercicios resueltos - Derivaciones y evaluaciones (PF)
1.
Calcular el resultado para la lista dada la siguiente especificación:
Aplicamos la especificación de para la lista :
El resultado para la lista es .
2.
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):
Primero evaluamos el caso base, :
Por lo tanto,
Para el paso inductivo, seguimos con :
Es necesario generalizar la función para poder derivarla. Definimos una nueva función tal que:
Evaluamos el caso base de :
Seguimos con el paso inductivo de :
Los programas son:
3.
Derivar la función a partir de la especificación:
Primero evaluamos el caso base, :
No podemos computar , por lo que necesitamos cambiar nuestro esquema inductivo. Nuestra lista vacía no puede ser evaluada, por lo que necesitamos evaluar .
Ahora seguimos con el paso inductivo :
Nuestro programa final sería:
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.