miércoles, 6 de abril de 2016

Evaluacion Perezosa

Tipos de Estrategias

De adentro hacia afuera o Call - by - value

De fuera hacia adentro o Call - by - name

Evaluaciones que no terminan


Técnicas de la Evaluación Funcional

Técnica de Bracktraking
Si una alternativa falla, el flujo retrocede hasta la ultima posición o intenta de nuevo.

Técnica de Guardias
Si mas de una es cierta, se escoge cualquiera de ellas.

Técnica de Aprendizaje Reforzado
Recordar decisiones exitosas y aumentar su prioridad así como considerar las decisiones en el contexto del estado mutable.


Funciones

La evaluación perezosa puede también reducir el consumo de memoria de una aplicación, ya que los valores se crean solo cuando se necesitan. Sin embargo, es difícil combinar con las operaciones típicas de programación imperativa, como el manejo de excepciones o las operaciones de entrada / salida, porque el orden de las operaciones puede quedar indeterminado.


Autor: Juan Manuel Martinez Maciel
Fecha: 06/04/2016
Referencias: https://www.goconqr.com/en/p/2613378-evaluacion-perezosa-mind_maps





Evaluación Perezosa

Haskell emplea características de un lenguaje funcional como la evaluación perezosa, la cual realiza operaciones cuando se le indique, no antes, ni después.

3.1. La estrategia de evaluación perezosa

 La operación que realizamos en funcional es aplicar funciones, la idea del tema que vamos a tratar a continuación es saber qué se tiene que tener en cuenta para determinar el orden en en que aplicarán las funciones de una expresión. 

3.2. Técnicas de programación funcional perezosa 

Los beneficios de la evaluación perezosa son: 

El incremento en el rendimiento al evitar cálculos innecesarios, y en tratar condiciones de error al evaluar expresiones compuestas. 

 La evaluación perezosa puede también reducir el consumo de memoria de una aplicación, ya que los valores se crean solo cuando se necesitan. Sin embargo, es difícil de combinar con la operaciones típicas de programación imperativa, como el manejo de excepciones o las operaciones de entrada/salida, porque el orden de las operaciones puede quedar indeterminado.

*Estrategias de evaluación
mult (x,y) = x*y

*Terminación
inf = 1 + inf

*Numero de reducciones
cuadrado n= n*n

*Estructuras infinitas
unos = 1:unos

*Programación modular
[1..]
take 3 [1..]

*Aplicación estricta


Ejemplo:

 masUno x = x + 1 
 masUno (2*3)
 masUno 6

Autor: Leroy Antonio Luna Rojas
Fecha: 06/04/2016
Bibliografía:
http://es.slideshare.net/JoseAAlonso/tema-10-evaluacin-perezosa-en-haskell
http://es.slideshare.net/JesusAntonioGarciaLopez1/123507620-queeslaevaluacionperezosadocx
http://itpn.mx/recursosisc/8semestre/programacionlogicayfuncional/Unidad%20III.pdf
https://lleksah.wordpress.com/haskell/



lunes, 4 de abril de 2016

Evaluación perezosa


 • Consiste en no evaluar un argumento hasta que no se necesita

 • Uno de los beneficios es la posibilidad de manipular estructuras de datos infinitas. Evidentemente, no es posible construir o almacenar un objeto infinito en su totalidad. Sin embargo, gracias a la evaluación perezosa se pueden construir objetos potencialmente infinitos pieza a pieza según las necesidades de la evaluación


Procesamiento con el infinito


 Evaluación mediante paso de parámetros por valor:

fst (0,inf)
= fst (0,1 + inf)                                [por def. inf]
= fst (0,1 + (1 + inf))                       [por def. inf]
= fst (0,1 + (1 + (1 + inf)))              [por def. inf]
= . . .


 Terminación de evaluaciones con estructuras infinitas


Ejemplo de no terminación: *Main> [1..]
 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20... 

Ejemplo de terminación: *Main> take 3 [1..]
 [1,2,3] 

Ejemplo de no terminación: *Main> filter (<=3) [1..] 
[1,2,3 C-c C-c Interrupted. 

Ejemplo de no terminación: *Main> takeWhile (<=3) [1..] 
[1,2,3] 


Autor: Karla Daniela Torres Castruita
Fecha: 05/04/2016
Bibliografía: http://www.cs.us.es/~jalonso/cursos/i1m-14/temas/tema-10.pdf
                  http://es.slideshare.net/psfracchia/programacin-funcional

Estrategia De Evaluación Perezosa



La evaluación perezosa se calcula una expresión (Parcial) solamente si realmente se necesita el valor para calcular el resultado.



  • El evaluador hace solamente lo preciso. Corresponde a llamada por necesidad.
  • Significa: Haz solo lo que te pida un patrón a la izquierda de una ecuación o cualificador. 
  • No se evalúa ningún elemento  en ninguna forma hasta que no sea necesario.
  • Las listas se almacenan internamente en un formato no evaluado.
  • La evaluación perezosa consiste en utilizar paso por nombre y recordar los valores de los argumentos ya calculados para evitar re calcularlos.

Ejemplo considerando la Función:

mult :: (Int , Int) -> Int
mult  (x,y) = x*y

Se dividen en grupos básicos estrictos y no estrictos basados en como se manejan los argumentos de una función.


Evaluación mediante paso de parámetros por valor Call by Value

    mult (1+2, 2+3)
=  mult (3,5)                           [por def. de mult]
=  3*5                                    [por def. de mult] 
=  15                                      [por def. de *]

Evaluación mediante paso de parámetros por nombre Call by Name

    mult (1+2,2+3)
=  (1+2)*(3+5)                      [por def. de mult]                 
=  3*5                                  [por def. de +]



Autor: Gloria Lizeth Alonso Arellano
Fecha: 4/Abril/2016
Referencias: 
https://prezi.com/oflutpangiac/evaluacion-perezosa/
http://es.slideshare.net/JesusAntonioGarciaLopez1/123507620-queeslaevaluacionperezosadocx

Estrategias Básicas


Una expresión que consta de una función aplicada a uno o mas parámetros puede ser reducida aplicando la función:

Mult (x,y) = x*y

Si queremos reducir:

Mult (1+2, 2+3)

Tipos de evaluaciones:

  • De adentro hacia afuera
  • De afuera hacia adentro
  • Evaluaciones que no terminan
Estrategia De Adentro Hacia Afuera

Esta estrategia elige el redex que esta "mas adentro", esto quiere decir, el redex que no contiene otro redex. Si existe mas de un redex que cumple dicha condición se elige el que esta mas a la izquierda.

Por ejemplo: mult (1+2, 2+3)

Aplicamos el primer +

mult (3, 2+3)

Aplicamos el segundo +

mult (3, 5)

Aplicamos la Multiplicación

3*5
Aplicamos *

15

Estrategia de Afuera Hacia Adentro

Elige el redex que esta "mas afuera" entendiendo por esto al redex que no esta contenido en otro redex. Si existe mas de un redex que cumple dicha condición se elige el que esta mas a la izquierda.

Por ejemplo: mult (1+2, 2+3)

Aplicamos Mult

(1+2) * (2+3)

Aplicamos el primer +

3 * (2+3)

Aplicamos el segundo +

3 * 5
 Aplicamos *

15

Evaluaciones que no terminan

Se tiene en cuenta la siguiente definición:

inf = 1 + inf

Intentar reducir la expresión inf siempre nos va a dar como resultado una expresión mas y mas grande (independientemente de la estrategia de evaluación que usemos).

inf

Aplicamos inf

1 + inf

Aplicamos inf (porque + es estricta)

1 + (1 + inf)

Aplicamos inf (porque + es estricta)

...1 + (1 +(1 + (1 +(1 +(1 +...+ inf)))))

Por ende, esta evaluación nunca terminaría...

Autor: Marlem Reyes
Fecha: 04/04/2016

jueves, 24 de marzo de 2016

Estructuras infinitas

Programación con estructuras infinitas
unos es una lista infinita de unos.
unos :: [Int]
unos = 1:unos
Evaluación:
unos
= 1 : unos [por def. unos]
= 1 : (1 : unos) [por def. unos]
= 1 : (1 : (1 : unos)) [por def. unos]
= ...

Evaluación en Haskell:
*Mani>
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,…

Evaluación con estructuras infinitas


Evaluación impaciente:

head unos = head (1 : unos) [por def. unos]
= head (1 : (1 : unos)) [por def. unos]
= head (1 : (1 : (1 : unos))) [por def. unos]
= ...

Evaluación perezosa:

head unos
= head (1 : unos) [por def. unos]
= 1 [por def. head]
Evaluación en Haskell:
*Mani>
1

Autor: Jose Silva
Fecha: 24/02/2016 
Bibliografia: https://www.cs.us.es/~jalonso/publicaciones/2013-Temas_de_PF_con_Haskell.pdf

¿Que es la Evaluación perezosa?



La evaluación perezosa  o llamada por necesidad es una estrategia de evaluación que retrasa el cálculo de una expresión hasta que su valor sea necesario, y que también evita repetir la evaluación en caso de ser necesaria en posteriores ocasiones. Esta compartición del cálculo puede reducir el tiempo de ejecución de ciertas funciones de forma exponencial, comparado con otros tipos de evaluación.

En los casos en que una expresión puramente funcional (no produzca efectos de borde ni dependa de objetos susceptibles a ser modificados) sea evaluada varias veces, esta pudiera ser evaluada solamente una vez y todas las demás evaluaciones remplazadas por la recuperación del valor ya calculado. Esta optimización se conoce como evaluación perezosa y es de particular importancia en la implementación de lenguajes funcionales con orden de evaluación normal.

Los beneficios de la evaluación perezosa son:
  • El incremento en el rendimiento al evitar cálculos innecesarios.
  • La capacidad de construir estructuras de datos potencialmente infinitas.
  • La evaluación perezosa puede también reducir el consumo de memoria de una aplicación.
Sin embargo, es difícil de combinar con las operaciones típicas de programación imperativa, como el manejo de excepciones o las operaciones de entrada/salida, porque el orden de las operaciones puede quedar indeterminado. Además, la evaluación perezosa puede conducir a fragmentar la memoria.



Ejemplo


function calcular ( func1(), func2(), func3() ) {
   ...
}

Un lenguaje sin evaluación perezosa ejecutaría las funciones func1(), func2() y func3() para obtener los parámetros finales y después continuaría con el cuerpo de la función. En cambio un lenguaje con evaluación perezosa empieza con el código de la función sin evaluar previamente las tres funciones. Las irá evaluando cuando aparezcan en el código y sean realmente necesarias. De esta forma, si un argumento no se utiliza, nunca será evaluado ( puede ocurrir que alguno de los parámetros esté dentro de un if que no se cumple )

Autor: Jose Silva 
Fecha: 24/03/2016
Bibliografía:  https://es.wikipedia.org/wiki/Evaluaci%C3%B3n_perezosa
http://ldc.usb.ve/~suarez/papers/lazyOpt.pdf