You are on page 1of 6

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/

You might also like