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 manuel.gomez.ch@gmail.com • David Lilue dvdalilue@gmail.com • Ricardo Monascal rmonascal@gmail.com • Wilmer Pereira wpereira@usb.ve 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