Ingeniería en Sistemas Computacionales Resumen
Nombre: Jose Luis Moo Noh Asignatura: Programación lógica y
Nombre del profesor : Lic. Antonio de
funcional
Jesús Cab Balam
Unidad: 3.- evaluación perezosa
Actividad: Resumen, evaluación
perezosa Fecha de entrega: 30 de abril de 2015 Fuentes de información: Betarte, G. (2015). Compilacion de Lenguajes Funcionales Perezosos. Lenguajes Perezosos. Lenguajes Funcionales perezosos, perezosos, 1-25.
Título: Evaluación perezosa Introducción: La base teórica de la programación imperativa fue dada por Alan Turing en los años treinta. También la teoría de funciones como modelo de computación proviene de los años veinte y treinta. Los fundadores son, entre otros, M. Schonfinkel. Haskell Curry y Alonso Church. Fue en el comienzo de los años cincuenta cuando a alguien se le ocurrió usar esta teoría efectivamente, como base de un lenguaje l enguaje de programación. El lenguaje de programación Lisp de John McCarthy fue el primer lenguaje de programación funcional y fue el único por muchos años. Debido a la creciente complejidad de los programas de ordenador, se hizo necesaria una mayor verificación del programa por parte del ordenador. Por ello el tipado adquirió una gran importancia. Por eso no es de extrañar que en los ochentas se creara un gran número de lenguajes funcionales tipados. Contenido:
(Betarte, 2015)
Página
de
Ingeniería en Sistemas Computacionales Resumen
Calculo lambda, un cálculo que captura el aspecto computacional de la noción de función. Los lenguajes funcionales modernos pueden ser entendidos como un embellecimiento sintáctico de
Página
de
Ingeniería en Sistemas Computacionales Resumen
Teorema: si es confluente entonces para toda expresión es su forma normal, si existe, es única. Estrategias de reducción, reglas de computación para seleccionar pasos de reducción: -
Leftmost-Outermost(Normal order)
-
Leftmost-Innermost(Applicative order)
-
Call-by-Name
-
Call-by-Value
Toda expresión lambda e tiene un punto fijo e´ tal que (e e´)= e
’
Toda función recursiva puede ser escrita sin usar recursión:
Tesis de church: las funciones de N en N efectivamente computables son aquellas definidas en el cálculo lambda. El lenguaje LISP: un lenguaje algebraico para el procesamiento de listas, cuenta con sus respectivas características como}}}. -
La expresión condicional y su uso en recursión
-
El uso de listas y funciones de alto orden sobre ellas
-
El uso de garbage collecting.
-
El uso de S-expressions para representar programas y datos.
El lenguaje Iswim, mecanización de evaluación de expresiones usando una maquina abstracta, trae consigo nuevas innovaciones como: -
-
Sintáctica o
Notación infija
o
Expresiones lety where: definiciones mutuas y recursivas
o
Uso de layout
Semántica o
Énfasis en generalidad: lenguaje rico sintácticamente en función de un lenguaje pequeño y muy expresivo. Página
de
Ingeniería en Sistemas Computacionales Resumen o
Énfasis en razonamiento ecuacional.
o
SECD como simple máquina abstracta en la cual se ejecutan expresiones funcionales.
Se presentan las siguientes características de los lenguajes de programación funcional: Funciones de alto orden, Funciones son consideradas ¨first-class values¨:
abstracción sobre un mecanismo de abstracción.
Alto orden como un mecanismo de modularización
Evaluación perezosa, Reglas de reducción con orden normal son las más
seguras, en el sentido de que garantizan la producción de forma normal (si existe). Permite emular recursión usando Y. Implementación ingenua puede ser muy ineficiente
La expresión (* 5 4) es calculada tantas veces como ocurrencias de x.
El elemento es evaluado antes que la B-reducción se efectúe. Desventajas: Puede evaluar innecesariamente (Ej. (\x.\y.x) 5 ((\x.x x) (\x.x x))). Exige reducción especial para implementar recursión La evaluación perezosa libera al programador de los problemas concernientes al orden de evaluación. Provee la posibilidad de computar usando estructuras de datos infinitas. Separación de datos de control. nats = 0 : map succ nats Página
de
Ingeniería en Sistemas Computacionales Resumen
filter p [] = [] filter p (x:xs) = if (p x) then (x:rest) else filter p xs
filter p nats puede ser escrito sabiendo que el grado de computación de la lista será determinado por el contexto. Al no tener control operacional puede ser compuesta con otras funciones modularmente. Abstracción de datos
Tipos algebraicos de datos (o concretos) data List a = Nil | Cons a (List a) data Tree b = Empty | Node b (List (Tree b)) List, Tree: constructores de tipos ( List :: Type -> Type) Nil, Cons, Empty, Node : constructores de datos (o simplemente constructores) Abreviación (sinónimos)
type Intree = Tree Int type Flattener = Intree -> [Int]
Ecuaciones y pattern-matching, Uso de razonamiento ecuacional en el diseño
y construcción de programas. La ausencia de efectos laterales permite el uso de r. e. Sintaxis también puede ayudar: escribir la definición de una función como una secuencia de ecuaciones. Pattern Matching es el concepto asociado al chequeo estructural de un dato respecto de una estructura esperada. El uso de pattern matching tiene la ventaja de simplificar mucho la codificación, ya que sólo escribimos la forma de lo que esperamos y podemos desglosar los componentes de estructuras complejas. Una desventaja asociada a usar pattern matching en vez de funciones para acceder a los elementos de las tuplas es que nuestro código se verá muy afectado ante un cambio en las estructuras manejadas. El simple hecho de agregar un elemento más a la tupla que representa a nuestro elemento de dominio provocará un cambio en el tipo del mismo y el mismo se propagará en todos los lugares donde se haya utilizado esta estructura directamente. Página
de