INSTITUTO TECNOLGICO DE TUXTLA GUTIRREZ
Ingeniera en Sistemas Computacionales
Programacin Lgica y Funcional
Nango Sols Galdino Belizario
Evaluacin Perezosa
Samuel De Jesus Ruiz Marroquin
Tuxtla Gutirrez, Chiapas. A 07 de Diciembre 2015
Evaluacin Perezosa.
En la teora de lenguajes de programacin, La evaluacin perezosa (del
ingls lazy evaluation) o llamada por necesidad es una estrategia de
evaluacin que retrasa el clculo de una expresin hasta que su valor sea
necesario, y que tambin evita repetir la evaluacin en caso de ser necesaria
en posteriores ocasiones. Esta comparticin del clculo puede reducir el tiempo
de ejecucin de ciertas funciones de forma exponencial, comparado con otros
tipos de evaluacin.
Los beneficios de la evaluacin perezosa son:
El incremento en el rendimiento al evitar clculos innecesarios, y en
tratar condiciones de error al evaluar expresiones compuestas.
La capacidad de construir estructuras de datos potencialmente infinitas.
La capacidad de definir estructuras de control como abstracciones, en
lugar de operaciones primitivas.
La evaluacin perezosa puede tambin reducir el consumo de memoria de una
aplicacin, ya que los valores se crean solo cuando se necesitan. Sin embargo,
es difcil de combinar con las operaciones tpicas de programacin imperativa,
como el manejo de excepciones o las operaciones de entrada/salida, porque el
orden de las operaciones puede quedar indeterminado. Adems, la evaluacin
perezosa puede conducir a fragmentar la memoria.
Lo contrario de la evaluacin perezosa sera la evaluacin acaparadora, o
evaluacin estricta, que es el modo de evaluacin por defecto en la mayora de
los lenguajes de programacin.
Tcnicas de Evaluacin Perezosa en la programacin Funcional.
Una estrategia de evaluacin es un conjunto de reglas para evaluar
expresiones
en
un
lenguaje
de
programacin.
Una estrategia de evaluacin define cundo y en qu orden los argumentos a
una funcin son evaluados, cuando se sustituyen en la funcin, y lo que la
sustitucin
se
forman.
Las estrategias de evaluacin se dividen en dos grupos bsicos, estrictos y no
estrictos, basados en cmo se manejan los argumentos de una funcin.
Estrategias bsicas
Una expresin que consta de una funcin aplicada a uno o ms parmetros y
que puede ser "reducida" aplicando dicha funcin la vamos a llamar Redex
(Reducible Expression).
Tipos
De adentro hacia afuera o call-by-value:
Esta estrategia elige el redex que est "ms adentro" entendiendo por esto al
redex que no contiene otro redex. Si existe ms de un redex que cumple dicha
condicin se elige el que est ms a la izquierda.
Por ejemplo: mult (1+2,2+3)
aplicamos el primer + :
mult (3,2+3)
aplicamos el + :
mult (3,5)
aplicamos mult :
3*5
aplicamos * :
15
Esta estrategia asegura que los parmetros de una funcin estn
completamente evaluados antes de que la funcin sea aplicada. Por eso se dice
que los parmetros se pasan por valor.
De afuera hacia adentro o call-by-name
Elige el redex que est "ms afuera" entendiendo por esto al redex que no est
contenido en otro redex. Si existe ms de un redex que cumple dicha condicin
se elige el que est ms a la izquierda.
Ejemplo: mult (1+2,2+3)
aplicamos mult :
(1+2) * (2+3)
aplicamos el primer + :
3 * (2+3)
aplicamos + :
3*5
aplicamos * :
15
El operador * y el + no pueden ser aplicados hasta que sus dos parmetros
hayan sido evaluados a nmeros. A las funciones que cumplen con esta
propiedad las vamos a llamar funciones estrictas.
Evaluaciones que no terminan
Tengan en cuenta la siguiente definicin
inf = 1 + inf
Intentar reducir la expresin inf siempre nos va a dar como resultado una
expresin ms y ms grande (independientemente de la estrategia de
evaluacin que usemos)
Inf
aplicamos inf :
1 + inf
aplicamos inf (porque + es estricta):
1 + (1 + inf)
aplicamos inf (porque + es estricta):
inf )))))
... 1 + (1 + (1 + (1 + (1 + (1 + .... +
Por ende, est evaluacin nunca terminara.
Sabiendo que
fst (x,_) = x
Consideremos la expresin fst (0,inf)
Usando la estrategia call-by-value:
fst (0,inf)
aplicamos inf :
fst (0, 1 + inf )
aplicamos inf :
fst (0, 1 + (1 + inf) )
aplicamos inf :
fst (0, 1 + (1 + (1 + inf) ) )
aplicamos inf:
Usando call-by-value la evaluacin de la expresin no termina.
Usemos call-by-name:
fst (0,inf)
aplicamos fst :
Si existe alguna secuencia de evaluacin que haga terminar la evaluacin de la
expresin entonces con la estrategia call-by-name tambin se termina la
evaluacin.
La semntica adoptada para el no determinismo es la de eleccin en la
invocacin (call-time choice), por resultar ms natural para la programacin y
ms eficaz en la ejecucin al corresponderse con el mecanismo de
comparticin.
En el no-determinismo existen varias tcnicas como son:
Tcnica de Backtracking (Prolog):
Si una alternativa falla, el ujo retorna hasta la ltima decisin e intenta otra.
Tcnica de guardias (guards):
Si ms de una es cierta, se escoge cualquiera de ellas.
Tcnica de aprendizaje reforzado (A-LISP):
Recordar decisiones exitosas y aumentar su prioridad as como considerar las
decisiones en el contexto del estado mutable.
Bsqueda no determinista
Un algoritmo no determinista
Ofrece muchos posibles resultados.
Emplean modelos de computacin tales como la Mquina de Turing
probabilstica, que no son deterministas
Puede simularse utilizando la lista de xitos como por ejemplo:
Soluciones x = x, x candidatos, vlidos
Datos no deterministas
Requiere tipo de datos diferente como son
Data list m a = nil (cons (m a) (m(list a))
Puede representar lista perezosa no determinista
Cons [2] [NIl. cons [1] ]:: list [] int
Los argumentos de cons representan computacin no determinista, permute y
IsSorted se pueden adaptar a la lista de tipo permute y genera permutaciones
perezosamente los rendimientos IsSorted [true, false] es aplicada por encima
de la lista (s).
Programacin funcional-lgica
La programacin lgica, junto con la funcional, forma parte de los que se
conoce como programacin declarativa. En los lenguajes tradicionales, la
programacin consiste en cmo resolver un problema mediante sentencias; en
la programacin lgica, se trabaja de forma descriptiva, estableciendo
relaciones entre entidades, indicando no como, sino que hacer.
La programacin funcional est constituida mediante definicin de funciones
puramente matemticas. Est basado en un modelo matemtico: lambdaclculo.
Bibliografas:
ldc.usb.ve/~suarez/papers/lazyOpt.pdf
https://www.cs.us.es/~jalonso/cursos/pd-09/temas/tema-10-1x2.pdf
https://prezi.com/lhnyd5gqlj_-/unidad-3-evaliacion-perezosa/