Tarea de investigación de programación funcional

Anuncio
Tarea de investigación de programación funcional
Laboratorio de Lenguajes de Programación I
Tarea de investigación de programación
funcional
Laboratorio de Lenguajes de Programación I
Enero–Marzo 2015
Índice general
1 Estrategias de evaluación
2
2 Codificación de Church
3
2.1
Pares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
2.2
Cálculo proposicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.3
Aritmética . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.4
Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
Esta tarea debe ser realizada en forma individual por cada alumno de CI3661. Debe enviar
su solución en un archivo llamado t1-XX-XXXXX.pdf (donde XX-XXXXX debe ser sustituido
por su número de carné) en formato PDF adjunto a un correo electrónico titulado [CI3661]
Tarea 1 a las direcciones de todos los encargados del curso:
• Manuel Gómez [email protected]
• David Lilue [email protected]
• Ricardo Monascal [email protected]
• Wilmer Pereira [email protected]
Universidad Simón Bolívar — Departamento de Computación y Tecnologías de la Información
CI3661 (Laboratorio de lenguajes de programación I) — Abril–Julio 2015
1
Tarea de investigación de programación funcional
Laboratorio de Lenguajes de Programación I
Debe enviar su solución antes de la medianoche entre el domingo 2015-04-19 y el lunes 201504-20 en hora legal de Venezuela.
Algunas de las preguntas y ejercicios de esta tarea de investigación hacen referencia a problemas de gran complejidad para los cuales no se espera que provea justificaciones completas
y precisas — se espera, en cambio, que haga referencia a los resultados de investigación
establecidos relevantes en cada caso.
1 Estrategias de evaluación
La evaluación de expresiones en el λ-cálculo procede por la aplicación sucesiva de la regla de
β-reducción. Esta regla puede ser aplicada en cualquier parte de un término donde ocurra
un redex: una sub-expresión reducible, que en el caso de la β-reducción corresponde a una
aplicación cuyo lado izquierdo es una abstracción.
Cuando un término contiene más de un redex, hay varios términos a los cuales se puede
reducir. Por otra parte, cuando un término no contiene ningún redex, se dice que el término
es una forma normal. Se dice también que un término b es una forma normal de otro término
a cuando a partir de a pueden realizarse β-reducciones en forma iterada hasta alcanzar la
forma normal b.
Se dice que dos términos del λ-cálculo son α-equivalentes cuando puede aplicarse una secuencia de α-conversiones a uno hasta convertirlo en el otro.
Tomando esto en cuenta, investigue y responda:
1. Usando el término inicial
(λ o. K) ((λ f. f f) (λ f. λx. f (f x)) A H)
muestre cada término obtenido al aplicarle β-reducciones en forma iterada hasta alcanzar una forma normal; realice en cada paso la β-reducción correspondiente al redex más
interno en ese paso. (1 punto)
2. Usando ese mismo término inicial, muestre cada término obtenido al aplicarle βreducciones en forma iterada hasta alcanzar una forma normal; realice esta vez en cada
paso la β-reducción correspondiente al redex más externo en ese paso. (1 punto)
Universidad Simón Bolívar — Departamento de Computación y Tecnologías de la Información
CI3661 (Laboratorio de lenguajes de programación I) — Abril–Julio 2015
2
Tarea de investigación de programación funcional
Laboratorio de Lenguajes de Programación I
3. ¿Existe algún término en el λ-cálculo con más de un redex que pueda convertirse en
una forma normal mediante una secuencia de aplicaciones sucesivas de β-reducción,
y que además pueda ser transformado por una secuencia de aplicaciones sucesivas de
β-reducción que sea infinita? De ser así, muestre un ejemplo de tal término con una
reducción hasta una forma normal, y demuestre que existe otra secuencia de reducciones
infinita. De lo contrario, explique por qué no puede existir tal término. (1 punto)
4. ¿Existe algún término en el λ-cálculo con más de un redex que pueda convertirse,
mediante dos secuencias distintas de aplicaciones suscesivas de β-reducción, en dos
formas normales que no sean α-equivalentes? De ser así, muestre un ejemplo de tal
término y desarrolle las dos reducciones que producen dos formas normales que no sean
α-equivalentes. De lo contrario, explique por qué no puede existir tal término. (1 punto)
5. ¿Existe algún término en el λ-cálculo que no pueda convertirse en una forma normal
mediante ninguna secuencia finita de β-reducciones? De ser así, muestre un ejemplo de
tal término y demuestre que toda secuencia de reducciones a partir de él es infinita. De
lo contrario, explique por qué no puede existir tal término. (1 punto)
2 Codificación de Church
2.1 Pares
Los pares ordenados pueden representarse en el λ-cálculo con la forma de introducción
pair = λ a. λ b. λ c. c a b
y con las formas de eliminación
fst = λ p. p (λ a. λ b. a) snd = λ p. p (λ a. λ b. b)
Usando estas definiciones, se desea construir un término swap que represente a una función
que tome una tupla t y produzca como resultado otra tupla con los mismos elementos que t
pero en las posiciones contrarias.
1. Dé una definición de swap en términos de pair, fst y snd como átomos predefinidos.
(0.5 puntos)
2. Sustituya en su respuesta anterior las definiciones de pair, fst y snd dadas, y muestre
los pasos sucesivos de β-reducción del término resultante hasta una forma normal. (0.5
puntos)
Universidad Simón Bolívar — Departamento de Computación y Tecnologías de la Información
CI3661 (Laboratorio de lenguajes de programación I) — Abril–Julio 2015
3
Tarea de investigación de programación funcional
Laboratorio de Lenguajes de Programación I
2.2 Cálculo proposicional
El cálculo proposicional clásico puede estudiarse mediante la manipulación simbólica de fórmulas proposicionales, que consisten de los símbolos fundamentales true y false, junto con
composiciones de fórmulas proposicionales complejas a partir de otras más simples usando
los operadores de conjunción, disyunción y negación.
1. Proponga una codificación en el λ-cálculo para el cálculo proposicional. En particular,
dé definiciones para los combinadores proposicionales elementales false y true como
λ-términos1 , y defina también and, or y not de forma tal que la evaluación de una
fórmula proposicional bien formada por estos combinadores pueda reducirse siempre
a una forma normal, que en particular será la de false o la de true según el valor
de la fórmula proposicional original. Los combinadores que correspondan a operadores
binarios del cálculo proposicional deberán corresponder a funciones currificadas de dos
parámetros. (1 punto)
2. Sustituya en la fórmula proposicional
or false (not false)
sus definiciones de los combinadores proposicionales, y muestre los pasos sucesivos de
β-reducción del término resultante hasta una forma normal. Si esa forma normal es αequivalente a algún combinador proposicional previamente definido, indique cuál. (0.5
puntos)
2.3 Aritmética
Los números naturales tienen la siguiente definición inductiva:
• Existe un número natural especial denominado cero.
• Dado un número natural n, es posible obtener otro número natural que se caracteriza
completamente por ser el sucesor de n.
Se desea trabajar con una codificación del concepto de número entero en el λ-cálculo. Para
este fin, se definirán términos del λ-cálculo que permitan introducir valores que representen
números naturales.
El cero se introducirá simplemente usando un término que se denominará zero:2
1
Note que false y true no pueden tener formas normales α-equivalentes entre sí — es decir, debe hacer
una representación fiel y no trivial del cálculo proposicional.
2
En algunos casos se utilizará una notación abreviada para escribir abstracciones cuyos cuerpos sean a su
vez también abstracciones. Por ejemplo, en vez de escribir λ x. λ y. z, se escribirá λ x y. z — esta notación
puede entenderse como que las abstracciones con múltiples parámetros representan funciones currificadas.
Universidad Simón Bolívar — Departamento de Computación y Tecnologías de la Información
CI3661 (Laboratorio de lenguajes de programación I) — Abril–Julio 2015
4
Tarea de investigación de programación funcional
Laboratorio de Lenguajes de Programación I
zero = λ f z. z
Los sucesores de otros números enteros se pueden construir si es dado el valor base cuyo
sucesor se busca. En este sentido, los sucesores de otros números enteros se introducirán
usando un término que se denominará succ y que esperará recibir como parámetro el número
natural cuyo sucesor se busca introducir:
succ = λ n. λ f z. n f (f z)
1. Proponga una definición para el término add que, al ser aplicado a la codificación de
dos números naturales, tenga como forma normal la codificación de la suma de esos dos
números. (0.5 puntos)
2. Verifique que 2 + 1 = 3 bajo su codificación — es decir, que la forma normal de add
(succ (succ zero) (succ zero) sea α-equivalente a la forma normal de succ (succ
(succ zero)).3 (0.5 puntos)
2.4 Listas
Una lista es una estructura de datos con una definición inductiva:
• Existe una lista especial denominada la lista vacía, y se dice que no tiene elementos.
• Dado un valor h y una lista t, es posible obtener otra lista l que se caracteriza completamente por tener el valor h en su cabeza, y la lista t en su cola; el primer elemento de
la lista l es el valor h, y los siguientes son los mismos de la lista t.
Se desea trabajar con una codificación del concepto de lista en el λ-cálculo. Para este fin, se
definirán términos del λ-cálculo que permitan introducir valores que representen listas.
La lista vacía se introducirá simplemente usando un término que se denominará nil. Note
que la lista vacía existe sin necesidad de especificar el valor de sus elementos (porque no tiene
ninguno).
nil = λ f z. z
Las listas no vacías se pueden construir si son dados los valores que serán ubicados en su
cabeza y su cola. En ese sentido, las listas no vacías se introducirán usando un término que
se denominará cons y que esperará recibir como parámetro la cabeza y la cola de la lista que
se busca introducir:
3
Algunas secuencias de reducciones para encontrar formas normales pueden ser largas, así que puede ser
conveniente apoyarse en herramientas que automaticen parte del proceso.
Universidad Simón Bolívar — Departamento de Computación y Tecnologías de la Información
CI3661 (Laboratorio de lenguajes de programación I) — Abril–Julio 2015
5
Tarea de investigación de programación funcional
Laboratorio de Lenguajes de Programación I
cons = λ h t. λ f z. f h (t f z)
La lista cuyos elementos, en orden, son los átomos 1, 2, 3 y 4, se puede construir así:
cons 1 (cons 2 (cons 3 (cons 4 nil)))
Proponga una definición para el término length que, al ser aplicado a la codificación de
una lista, tenga como forma normal la codificación del número natural correspondiente a su
longitud. (1.5 puntos)
Universidad Simón Bolívar — Departamento de Computación y Tecnologías de la Información
CI3661 (Laboratorio de lenguajes de programación I) — Abril–Julio 2015
6
Descargar