Está en la página 1de 4

Subsecretara de Educacin Superior

Direccin General de Educacin Superior Tecnolgica


Instituto Tecnolgico Superior de Ciudad Acua

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.

Unidad III

Programacin Lgica y Funcional Pgina 1

Subsecretara de Educacin Superior


Direccin General de Educacin Superior Tecnolgica
Instituto Tecnolgico Superior de Ciudad Acua

3.1. La estrategia de evaluacin perezosa


Las estrategias de evaluacin se dividen en dos grupos bsicos, estrictos y no
estrictos, basados en cmo se manejan los argumentos de una funcin.
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.
De afuera hacia adentro o call-by-name:
Elige el redex que est "ms afuera" entendiendo por esto al redex que no esta
contenido en otro redex. Si existe ms de un redex que cumple dicha condicin se
elige el que est ms a la izquierda.
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)
Unidad III

Programacin Lgica y Funcional Pgina 2

Subsecretara de Educacin Superior


Direccin General de Educacin Superior Tecnolgica
Instituto Tecnolgico Superior de Ciudad Acua

1 + (1 + inf)
aplicamos inf (porque + es estricta)
... 1 + (1 + (1 + (1 + (1 + (1 + .... + inf )))))
Por ende, est evaluacin nunca terminara.

Para los ejemplos se considera la funcin


mult :: (Int,Int) -> Int
mult (x,y) = x*y
Evaluacin mediante paso de parmetros por valor (o por ms internos):
mult (1+2,2+3)
= mult (3,5)
[por def. de +]
= 3*5
[por def. de mult]
= 15
[por def. de *]
Evaluacin mediante paso de parmetros por nombre (o por ms externos):
mult (1+2,2+3)
= (1+2)*(3+5)
= 3*5
= 15

[por def. de mult]


[por def. de +]
[por def. de *]

Evaluacin con lambda expresiones


Se considera la funcin
mult' :: Int -> Int -> Int
mult' x = \y -> x*y
Evaluacin:
mult (1+2) (2+3)
= mult 3 (2+3)
= (_y ! 3*y) (2+3)
= (_y ! 3*y) 5
= 3*5
= 15

Unidad III

[por def. de +]
[por def. de mult]
[por def. de +]
[por def. de +]
[por def. de *]

Programacin Lgica y Funcional Pgina 3

Subsecretara de Educacin Superior


Direccin General de Educacin Superior Tecnolgica
Instituto Tecnolgico Superior de Ciudad Acua

3.2. Tcnicas de programacin funcional perezosa


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 el corresponderse con el mecanismo de comparticin.
En el no-determinismo existen varias tcnicas como son:

Tcnica de backtracking (prolog)


Si un alternativa falla, el flujo retorna hasta la ltima decisin e intente
otra.
Tcnica de guardias (guards)
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

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

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] j]:: list [] int
Los argumentos de cons representan computacin no determinista, permute y
IsSorted se pueden adoptar a la lista de tipo permute y genera permutaciones
perezosamente los rendimientos IsSorted [true, false] es aplicada por encima de la
lista (s).

Unidad III

Programacin Lgica y Funcional Pgina 4

También podría gustarte