SlideShare una empresa de Scribd logo
Tema 11: Aplicaciones de programación funcional
                  Informática (2010–11)


                  José A. Alonso Jiménez

                Grupo de Lógica Computacional
        Departamento de Ciencias de la Computación e I.A.
                     Universidad de Sevilla
IM Tema 11: Aplicaciones de programación funcional




Tema 11: Aplicaciones de programación funcional

  1. El juego de cifras y letras
         Introducción
         Búsqueda de la solución por fuerza bruta
         Búsqueda combinando generación y evaluación
         Búsqueda mejorada mediante propiedades algebraicas


  2. El problema de las reinas


  3. Números de Hamming



                                                              2 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras




Tema 11: Aplicaciones de programación funcional

  1. El juego de cifras y letras
         Introducción
         Búsqueda de la solución por fuerza bruta
         Búsqueda combinando generación y evaluación
         Búsqueda mejorada mediante propiedades algebraicas

  2. El problema de las reinas

  3. Números de Hamming




                                                              3 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Introducción



Tema 11: Aplicaciones de programación funcional

  1. El juego de cifras y letras
         Introducción
         Búsqueda de la solución por fuerza bruta
         Búsqueda combinando generación y evaluación
         Búsqueda mejorada mediante propiedades algebraicas

  2. El problema de las reinas

  3. Números de Hamming




                                                              4 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Introducción



Presentación del juego
         Cifras y letras es un programa de Canal Sur que incluye un juego
         numérico cuya esencia es la siguiente:
                    Dada una sucesión de números naturales y un número objetivo,
                    intentar construir una expresión cuyo valor es el objetivo
                    combinando los números de la sucesión usando suma, resta,
                    multiplicación, división y paréntesis. Cada número de la sucesión
                    puede usarse como máximo una vez. Además, todos los números,
                    incluyendo los resultados intermedios tienen que ser enteros
                    positivos (1,2,3,. . . ).
         Ejemplos
                    Dada la sucesión 1, 3, 7, 10, 25, 50 y el objetivo 765, una solución
                    es (1+50)*(25−10).
                    Para el problema anterior, existen 780 soluciones.
                    Con la sucesión anterior y el objetivo 831, no hay solución.


                                                                                           5 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Introducción



Formalización del problema: Operaciones
         Las operaciones son sumar, restar, multiplicar o dividir.

         data Op = Sum | Res | Mul | Div

         instance Show               Op where
            show Sum =               "+"
            show Res =               "-"
            show Mul =               "*"
            show Div =               "/"
         ops es la lista de las operaciones.

         ops :: [Op]
         ops = [Sum,Res,Mul,Div]

                                                                     6 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Introducción



Operaciones válidas
         (valida o x y) se verifica si la operación o aplicada a los
         números naturales x e y da un número natural. Por ejemplo,
          valida Res 5 3          True
          valida Res 3 5          False
          valida Div 6 3          True
          valida Div 6 4          False

         valida          :: Op     -> Int -> Int -> Bool
         valida          Sum _     _ = True
         valida          Res x     y = x > y
         valida          Mul _     _ = True
         valida          Div x     y = y /= 0 && x `mod` y == 0


                                                                      7 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Introducción



Aplicación de operaciones
         (aplica o x y) es el resultado de aplicar la operación o a los
         números naturales x e y. Por ejemplo,
          aplica Sum 2 3          5
          aplica Div 6 3          2

         aplica          :: Op     -> Int -> Int -> Int
         aplica          Sum x     y = x + y
         aplica          Res x     y = x - y
         aplica          Mul x     y = x * y
         aplica          Div x     y = x `div` y




                                                                          8 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Introducción



Expresiones
        Las expresiones son números enteros o aplicaciones de operaciones a
        dos expresiones.

        data Expr = Num Int | Apl Op Expr Expr

        instance Show Expr where
           show (Num n)     = show n
           show (Apl o i d) = parentesis i ++ show o ++ parentesis d
                              where
                                 parentesis (Num n) = show n
                                 parentesis e       = "(" ++ show e ++ ")"
        Ejemplo: Expresión correspondiente a (1+50)*(25−10)

        ejExpr :: Expr
        ejExpr = Apl Mul e1 e2
            where e1 = Apl Sum (Num 1) (Num 50)
                  e2 = Apl Res (Num 25) (Num 10)

                                                                              9 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Introducción



Números de una expresión
         (numeros e) es la lista de los números que aparecen en la
         expresión e. Por ejemplo,
          *Main> numeros (Apl Mul (Apl Sum (Num 2) (Num 3)) (Num 7))
          [2,3,7]

         numeros :: Expr -> [Int]
         numeros (Num n)     = [n]
         numeros (Apl _ l r) = numeros l ++ numeros r




                                                               10 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Introducción



Valor de una expresión
         (valor e) es la lista formada por el valor de la expresión e si
         todas las operaciones para calcular el valor de e son números
         positivos y la lista vacía en caso contrario. Por ejemplo,
          valor (Apl Mul (Apl Sum (Num 2) (Num 3)) (Num 7))                [35]
          valor (Apl Res (Apl Sum (Num 2) (Num 3)) (Num 7))                []
          valor (Apl Sum (Apl Res (Num 2) (Num 3)) (Num 7))                []

         valor :: Expr -> [Int]
         valor (Num n)     = [n | n > 0]
         valor (Apl o i d) = [aplica o x y | x <- valor i
                                           , y <- valor d
                                           , valida o x y]


                                                                           11 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Introducción



Funciones combinatorias: Sublistas
         (sublistas xs) es la lista de las sublistas de xs. Por ejemplo,
          *Main> sublistas "bc"
          ["","c","b","bc"]
          *Main> sublistas "abc"
          ["","c","b","bc","a","ac","ab","abc"]

         sublistas              :: [a] -> [[a]]
         sublistas              []     = [[]]
         sublistas              (x:xs) = yss ++ map (x:) yss
             where              yss = sublistas xs




                                                                           12 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Introducción



Funciones combinatoria: Intercalado
         (intercala x ys) es la lista de las listas obtenidas intercalando
         x entre los elementos de ys. Por ejemplo,
          intercala 'x' "bc"            ["xbc","bxc","bcx"]
          intercala 'x' "abc"           ["xabc","axbc","abxc","abcx"]

         intercala :: a -> [a] -> [[a]]
         intercala x []     = [[x]]
         intercala x (y:ys) =
             (x:y:ys) : map (y:) (intercala x ys)




                                                                         13 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Introducción



Funciones combinatoria: Permutaciones
         (permutaciones xs) es la lista de las permutaciones de xs. Por
         ejemplo,
          *Main> permutaciones "bc"
          ["bc","cb"]
          *Main> permutaciones "abc"
          ["abc","bac","bca","acb","cab","cba"]

         permutaciones :: [a] -> [[a]]
         permutaciones []     = [[]]
         permutaciones (x:xs) =
             concat (map (intercala x) (permutaciones xs))



                                                                          14 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Introducción



Funciones combinatoria: Elecciones
         (elecciones xs) es la lista formada por todas las sublistas de
         xs en cualquier orden. Por ejemplo,
          *Main> elecciones "abc"
          ["","c","b","bc","cb","a","ac","ca","ab","ba",
           "abc","bac","bca","acb","cab","cba"]

         elecciones :: [a] -> [[a]]
         elecciones xs =
             concat (map permutaciones (sublistas xs))




                                                                          15 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Introducción



Reconocimiento de las soluciones
         (solucion e ns n) se verifica si la expresión e es una solución
         para la sucesión ns y objetivo n; es decir. si los números de e es
         una posible elección de ns y el valor de e es n. Por ejemplo,
          solucion ejExpr [1,3,7,10,25,50] 765 => True

         solucion :: Expr -> [Int] -> Int -> Bool
         solucion e ns n =
             elem (numeros e) (elecciones ns) && valor e == [n]




                                                                              16 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda de la solución por fuerza bruta



Tema 11: Aplicaciones de programación funcional

  1. El juego de cifras y letras
         Introducción
         Búsqueda de la solución por fuerza bruta
         Búsqueda combinando generación y evaluación
         Búsqueda mejorada mediante propiedades algebraicas

  2. El problema de las reinas

  3. Números de Hamming




                                                              17 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda de la solución por fuerza bruta



Divisiones de una lista
         (divisiones xs) es la lista de las divisiones de xs en dos listas
         no vacías. Por ejemplo,
          *Main> divisiones "bcd"
          [("b","cd"),("bc","d")]
          *Main> divisiones "abcd"
          [("a","bcd"),("ab","cd"),("abc","d")]

         divisiones :: [a] -> [([a],[a])]
         divisiones []     = []
         divisiones [_]    = []
         divisiones (x:xs) =
             ([x],xs) : [(x:is,ds) | (is,ds) <- divisiones xs]


                                                                             18 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda de la solución por fuerza bruta



Expresiones construibles
         (expresiones ns) es la lista de todas las expresiones
         construibles a partir de la lista de números ns. Por ejemplo,
          *Main> expresiones [2,3,5]
          [2+(3+5),2-(3+5),2*(3+5),2/(3+5),2+(3-5),2-(3-5),
           2*(3-5),2/(3-5),2+(3*5),2-(3*5),2*(3*5),2/(3*5),
           2+(3/5),2-(3/5),2*(3/5),2/(3/5),(2+3)+5,(2+3)-5,
           ...

         expresiones              :: [Int] -> [Expr]
         expresiones              [] = []
         expresiones              [n] = [Num n]
         expresiones              ns = [e | (is,ds)    <-   divisiones ns
                                           , i         <-   expresiones is
                                           , d         <-   expresiones ds
                                           , e         <-   combina i d]
                                                                             19 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda de la solución por fuerza bruta



Combinación de expresiones
         (combina e1 e2) es la lista de las expresiones obtenidas
         combinando las expresiones e1 y e2 con una operación. Por
         ejemplo,
          *Main> combina (Num 2) (Num 3)
          [2+3,2-3,2*3,2/3]

         combina :: Expr -> Expr -> [Expr]
         combina e1 e2 = [Apl o e1 e2 | o <- ops]




                                                                     20 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda de la solución por fuerza bruta



Búsqueda de las soluciones
         (soluciones ns n) es la lista de las soluciones para la sucesión
         ns y objetivo n calculadas por fuerza bruta. Por ejemplo,
          *Main> soluciones [1,3,7,10,25,50] 765
          [3*((7*(50-10))-25), ((7*(50-10))-25)*3, ...
          *Main> length (soluciones [1,3,7,10,25,50] 765)
          780
          *Main> length (soluciones [1,3,7,10,25,50] 831)
          0

         soluciones :: [Int] -> Int -> [Expr]
         soluciones ns n = [e | ns' <- elecciones ns
                               , e <- expresiones ns'
                               , valor e == [n]]

                                                                            21 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda de la solución por fuerza bruta



Estadísticas de la búsqueda por fuerza bruta
         Estadíticas:
          *Main> :set +s
          *Main> head (soluciones [1,3,7,10,25,50] 765)
          3*((7*(50-10))-25)
          (8.47 secs, 400306836 bytes)
          *Main> length (soluciones [1,3,7,10,25,50] 765)
          780
          (997.76 secs, 47074239120 bytes)
          *Main> length (soluciones [1,3,7,10,25,50] 831)
          0
          (1019.13 secs, 47074535420 bytes)
          *Main> :unset +s


                                                            22 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda combinando generación y evaluación



Tema 11: Aplicaciones de programación funcional

  1. El juego de cifras y letras
         Introducción
         Búsqueda de la solución por fuerza bruta
         Búsqueda combinando generación y evaluación
         Búsqueda mejorada mediante propiedades algebraicas

  2. El problema de las reinas

  3. Números de Hamming




                                                              23 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda combinando generación y evaluación



Resultados
        Resultado es el tipo de los pares formados por expresiones válidas y
        su valor.

        type Resultado = (Expr,Int)
        (resultados ns) es la lista de todos los resultados construibles a
        partir de la lista de números ns. Por ejemplo,
         *Main> resultados [2,3,5]
         [(2+(3+5),10), (2*(3+5),16), (2+(3*5),17), (2*(3*5),30), ((2+3)+5,10),
          ((2+3)*5,25), ((2+3)/5,1), ((2*3)+5,11), ((2*3)-5,1), ((2*3)*5,30)]

        resultados         :: [Int] -> [Resultado]
        resultados         [] = []
        resultados         [n] = [(Num n,n) | n > 0]
        resultados         ns = [res | (is,ds) <- divisiones ns
                                      , ix      <- resultados is
                                      , dy      <- resultados ds
                                      , res     <- combina' ix dy]

                                                                                  24 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda combinando generación y evaluación



Combinación de resultados
        (combina’ r1 r2) es la lista de los resultados obtenidos combinando
        los resultados r1 y r2 con una operación. Por ejemplo,
         *Main> combina' (Num 2,2) (Num 3,3)
         [(2+3,5),(2*3,6)]
         *Main> combina' (Num 3,3) (Num 2,2)
         [(3+2,5),(3-2,1),(3*2,6)]
         *Main> combina' (Num 2,2) (Num 6,6)
         [(2+6,8),(2*6,12)]
         *Main> combina' (Num 6,6) (Num 2,2)
         [(6+2,8),(6-2,4),(6*2,12),(6/2,3)]

        combina' :: Resultado -> Resultado -> [Resultado]
        combina' (i,x) (d,y) =
            [(Apl o i d, aplica o x y) | o <- ops
                                       , valida o x y]
                                                                              25 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda combinando generación y evaluación



Búsqueda combinando generación y evaluación
         (soluciones’ ns n) es la lista de las soluciones para la
         sucesión ns y objetivo n calculadas intercalando generación y
         evaluación. Por ejemplo,
          *Main> head (soluciones' [1,3,7,10,25,50] 765)
          3*((7*(50-10))-25)
          *Main> length (soluciones' [1,3,7,10,25,50] 765)
          780
          *Main> length (soluciones' [1,3,7,10,25,50] 831)
          0

         soluciones' :: [Int] ->                     Int -> [Expr]
         soluciones' ns n = [e |                     ns' <- elecciones ns
                               ,                     (e,m) <- resultados ns'
                               ,                     m == n]
                                                                               26 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda combinando generación y evaluación



Estadísticas de la búsqueda combinada
         Estadísticas:
          *Main> head (soluciones' [1,3,7,10,25,50] 765)
          3*((7*(50-10))-25)
          (0.81 secs, 38804220 bytes)
          *Main> length (soluciones' [1,3,7,10,25,50] 765)
          780
          (60.73 secs, 2932314020 bytes)
          *Main> length (soluciones' [1,3,7,10,25,50] 831)
          0
          (61.68 secs, 2932303088 bytes)




                                                             27 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda mejorada mediante propiedades algebraicas



Tema 11: Aplicaciones de programación funcional

  1. El juego de cifras y letras
         Introducción
         Búsqueda de la solución por fuerza bruta
         Búsqueda combinando generación y evaluación
         Búsqueda mejorada mediante propiedades algebraicas

  2. El problema de las reinas

  3. Números de Hamming




                                                              28 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda mejorada mediante propiedades algebraicas



Aplicaciones válidas
         (valida’ o x y) se verifica si la operación o aplicada a los
         números naturales x e y da un número natural, teniendo en
         cuenta las siguientes reducciones algebraicas
             x + y = y + x
             x * y = y * x
             x * 1 = x
             1 * y = y
             x / 1 = x

         valida'           :: Op     -> Int -> Int -> Bool
         valida'           Sum x     y = x <= y
         valida'           Res x     y = x > y
         valida'           Mul x     y = x /= 1 && y /= 1 && x <= y
         valida'           Div x     y = y /= 0 && y /= 1 && x `mod` y == 0
                                                                              29 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda mejorada mediante propiedades algebraicas



Resultados válidos construibles
         (resultados’ ns) es la lista de todos los resultados válidos
         construibles a partir de la lista de números ns. Por ejemplo,
          *Main> resultados' [5,3,2]
          [(5-(3-2),4),((5-3)+2,4),((5-3)*2,4),((5-3)/2,1)]

         resultados'             :: [Int] -> [Resultado]
         resultados'             [] = []
         resultados'             [n] = [(Num n,n) | n > 0]
         resultados'             ns = [res | (is,ds) <- divisiones ns
                                            , ix      <- resultados' is
                                            , dy      <- resultados' ds
                                            , res     <- combina'' ix dy]


                                                                            30 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda mejorada mediante propiedades algebraicas



Combinación de resultados válidos
         (combina” r1 r2) es la lista de los resultados válidos obtenidos
         combinando los resultados r1 y r2 con una operación. Por
         ejemplo,
          combina'' (Num 2,2) (Num 3,3) => [(2+3,5),(2*3,6)]
          combina'' (Num 3,3) (Num 2,2) => [(3-2,1)]
          combina'' (Num 2,2) (Num 6,6) => [(2+6,8),(2*6,12)]
          combina'' (Num 6,6) (Num 2,2) => [(6-2,4),(6/2,3)]

         combina'' :: Resultado -> Resultado -> [Resultado]
         combina'' (i,x) (d,y) =
             [(Apl o i d, aplica o x y) | o <- ops
                                        , valida' o x y]


                                                                            31 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda mejorada mediante propiedades algebraicas



Búsqueda mejorada mediante propiedades algebraicas
         (soluciones” ns n) es la lista de las soluciones para la
         sucesión ns y objetivo n calculadas intercalando generación y
         evaluación y usando las mejoras aritméticas. Por ejemplo,
          *Main> head (soluciones'' [1,3,7,10,25,50] 765)
          3*((7*(50-10))-25)
          *Main> length (soluciones'' [1,3,7,10,25,50] 765)
          49
          *Main> length (soluciones'' [1,3,7,10,25,50] 831)
          0

         soluciones'' :: [Int] ->                         Int -> [Expr]
         soluciones'' ns n = [e |                         ns' <- elecciones ns
                                ,                         (e,m) <- resultados' ns'
                                ,                         m == n]
                                                                                     32 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda mejorada mediante propiedades algebraicas



Estadísticas de la búsqueda mejorada
         Estadísticas:
          *Main> head (soluciones'' [1,3,7,10,25,50] 765)
          3*((7*(50-10))-25)
          (0.40 secs, 16435156 bytes)
          *Main> length (soluciones'' [1,3,7,10,25,50] 765)
          49
          (10.30 secs, 460253716 bytes)
          *Main> length (soluciones'' [1,3,7,10,25,50] 831)
          0
          (10.26 secs, 460253908 bytes)Ÿ




                                                              33 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda mejorada mediante propiedades algebraicas



Comparación de las búsquedas
  Comparación de las búsquedad problema de dados [1,3,7,10,25,50]
  obtener 765.
         Búsqueda de la primera solución:
                            +---------------------+
                            | segs. | bytes       |
          +--------------+-------+-------------+
          | soluciones      | 8.47 | 400.306.836 |
          | soluciones' | 0.81 | 38.804.220 |
          | soluciones'' | 0.40 | 16.435.156 |
          +--------------+-------+-------------+




                                                                    34 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda mejorada mediante propiedades algebraicas



Comparación de las búsquedas
         Búsqueda de todas las soluciones:
                           +--------+----------------+
                           | segs. | bytes             |
          +--------------+--------+----------------+
          | soluciones     | 997.76 | 47.074.239.120 |
          | soluciones' | 60.73 | 2.932.314.020 |
          | soluciones'' | 10.30 |         460.253.716 |
          +--------------+--------+----------------+




                                                           35 / 45
IM Tema 11: Aplicaciones de programación funcional
  El juego de cifras y letras
     Búsqueda mejorada mediante propiedades algebraicas



Comparación de las búsquedas
  Comprobación de que dados [1,3,7,10,25,50] no puede obtenerse 831
                        +---------+----------------+
                        | segs. | bytes            |
         +--------------+---------+----------------+
         | soluciones   | 1019.13 | 47.074.535.420 |
         | soluciones' | 61.68 | 2.932.303.088 |
         | soluciones'' | 10.26 |      460.253.908 |
         +--------------+---------+----------------+




                                                                      36 / 45
IM Tema 11: Aplicaciones de programación funcional
  El problema de las reinas




Tema 11: Aplicaciones de programación funcional

  1. El juego de cifras y letras

  2. El problema de las reinas

  3. Números de Hamming




                                                     37 / 45
IM Tema 11: Aplicaciones de programación funcional
  El problema de las reinas




El problema de las N reinas
         Enunciado: Colocar N reinas en un tablero rectangular de
         dimensiones N por N de forma que no se encuentren más de una
         en la misma línea: horizontal, vertical o diagonal.
         El problema se representa en el módulo Reinas. Importa la
         diferencia de conjuntos () del módulo List:

         module Reinas where
         import Data.List (())

         El tablero se representa por una lista de números que indican las
         filas donde se han colocado las reinas. Por ejemplo, [3,5] indica
         que se han colocado las reinas (1,3) y (2,5).

         type Tablero = [Int]
                                                                             38 / 45
IM Tema 11: Aplicaciones de programación funcional
  El problema de las reinas




El problema de las N reinas
         reinas n es la lista de soluciones del problema de las N reinas.
         Por ejemplo, reinas 4 [[3,1,4,2],[2,4,1,3]]. La primera
         solución [3,1,4,2] se interpreta como
                      R
                              R
                  R
                          R


         reinas :: Int -> [Tablero]
         reinas n = aux n
             where aux 0     = [[]]
                   aux (m+1) = [r:rs | rs <- aux m,
                                       r <- ([1..n]  rs),
                                       noAtaca r rs 1]                      39 / 45
IM Tema 11: Aplicaciones de programación funcional
  El problema de las reinas




El problema de las N reinas
         noAtaca r rs d se verifica si la reina r no ataca a niguna de
         las de la lista rs donde la primera de la lista está a una distancia
         horizontal d.

         noAtaca :: Int -> Tablero -> Int -> Bool
         noAtaca _ [] _ = True
         noAtaca r (a:rs) distH = abs(r-a) /= distH &&
                                  noAtaca r rs (distH+1)




                                                                                40 / 45
IM Tema 11: Aplicaciones de programación funcional
  Números de Hamming




Tema 11: Aplicaciones de programación funcional

  1. El juego de cifras y letras

  2. El problema de las reinas

  3. Números de Hamming




                                                     41 / 45
IM Tema 11: Aplicaciones de programación funcional
  Números de Hamming




Números de Hamming
         Enunciado: Los números de Hamming forman una sucesión
         estrictamente creciente de números que cumplen las siguientes
         condiciones:
            1. El número 1 está en la sucesión.
            2. Si x está en la sucesión, entonces 2x , 3x y 5x también están.
            3. Ningún otro número está en la sucesión.
         hamming es la sucesión de Hamming. Por ejemplo,
          take 12 hamming       [1,2,3,4,5,6,8,9,10,12,15,16]

         hamming :: [Int]
         hamming = 1 : mezcla3 [2*i | i <- hamming]
                               [3*i | i <- hamming]
                               [5*i | i <- hamming]

                                                                                42 / 45
IM Tema 11: Aplicaciones de programación funcional
  Números de Hamming




Números de Hamming
         mezcla3 xs ys zs es la lista obtenida mezclando las listas
         ordenadas xs, ys y zs y eliminando los elementos duplicados.
         Por ejemplo,
          Main> mezcla3 [2,4,6,8,10] [3,6,9,12] [5,10]
          [2,3,4,5,6,8,9,10,12]

         mezcla3 :: [Int] -> [Int] -> [Int] -> [Int]
         mezcla3 xs ys zs = mezcla2 xs (mezcla2 ys zs)




                                                                        43 / 45
IM Tema 11: Aplicaciones de programación funcional
  Números de Hamming




Números de Hamming
         mezcla2 xs ys zs es la lista obtenida mezclando las listas
         ordenadas xs e ys y eliminando los elementos duplicados. Por
         ejemplo,
          Main> mezcla2 [2,4,6,8,10,12] [3,6,9,12]
          [2,3,4,6,8,9,10,12]

         mezcla2 :: [Int] -> [Int] -> [Int]
         mezcla2 p@(x:xs) q@(y:ys) | x < y            =   x:mezcla2 xs q
                                   | x > y            =   y:mezcla2 p ys
                                   | otherwise        =   x:mezcla2 xs ys
         mezcla2 []       ys                          =   ys
         mezcla2 xs       []                          =   xs


                                                                        44 / 45
IM Tema 11: Aplicaciones de programación funcional
  Bibliografía




Bibliografía
    1. G. Hutton Programming in Haskell. Cambridge University Press,
       2007.
                 Cap. 11: The countdown problem.
    2. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo. Razonando
       con Haskell. Thompson, 2004.
                 Cap. 13: Puzzles y solitarios.




                                                                         45 / 45

Más contenido relacionado

PPTX
Transformar modelo entidad relacion a modelo logico
PPTX
Organización lógica y física.
PPTX
Diagramas de despliegue
PPS
Pilas y colas
PPS
Modelo objeto semántico
PDF
Metodologiasad 1
PPTX
Analisis Y DiseñO Orientado A Objetos
PPTX
Transformar modelo entidad relacion a modelo logico
Organización lógica y física.
Diagramas de despliegue
Pilas y colas
Modelo objeto semántico
Metodologiasad 1
Analisis Y DiseñO Orientado A Objetos

La actualidad más candente (20)

PPTX
Fundamentos de base de datos 1a. unidad
PDF
Base de datos distribuidas vs centralizadas
PPTX
Fundamentos de las bases de datos
PDF
Estructura de Datos: Lista
PPTX
Elementos de diagramas de objetos
PPT
Lenguaje SQL
PDF
Unidad 2. metodologías de desarrollo DE SOFTWARE
DOC
Sistema de archivos
PDF
Examen final de base de datos ii solucionado
PPTX
Fundamentos de BD - Unidad 2 Modelo Entidad Relacion
PPTX
Tipos de usuarios en una base de datos
PPTX
Ventajas y desventajas de las bdoo
PDF
Modelo Orientado A Objetos
PPT
Caso de Uso
DOCX
Cuadro comparativo
PPTX
Portafolio de evidencias taller de legislacion informatica avance 3
PDF
Diseño de la interfaz de usuario
PPTX
Sistema De Gestión De Base De Datos
DOCX
Componentes y evolucion del modelado de negocios(investigacion)
PPTX
Segmentacion de memoria
Fundamentos de base de datos 1a. unidad
Base de datos distribuidas vs centralizadas
Fundamentos de las bases de datos
Estructura de Datos: Lista
Elementos de diagramas de objetos
Lenguaje SQL
Unidad 2. metodologías de desarrollo DE SOFTWARE
Sistema de archivos
Examen final de base de datos ii solucionado
Fundamentos de BD - Unidad 2 Modelo Entidad Relacion
Tipos de usuarios en una base de datos
Ventajas y desventajas de las bdoo
Modelo Orientado A Objetos
Caso de Uso
Cuadro comparativo
Portafolio de evidencias taller de legislacion informatica avance 3
Diseño de la interfaz de usuario
Sistema De Gestión De Base De Datos
Componentes y evolucion del modelado de negocios(investigacion)
Segmentacion de memoria
Publicidad

Similar a Tema 11: Aplicaciones de la programación funcional con Haskell (20)

PDF
Tema 1: Introducción a la programación funcional.
DOC
PDF
PPTX
Asignación n°4
PDF
Problemas "1er CusContest"
DOC
Examen trianual informatica
PDF
Tema 7: Funciones de orden superior en Haskell
PPT
Algoritmos y Estructura de Datos
PPT
2 algoritmos-1
PPTX
1. vers. cap-3_tipos_dedatos
PPTX
1. vers. cap-3_tipos_dedatos
PDF
lazy evaluation parte2 - temas avanzado.pdf
ODP
Electrónica: circuitos combinacionales
DOC
DOC
Como Programar
DOC
Matematicas aplicadas a la computacion
DOC
Teorico1
PDF
Tema3
PDF
tutorial y Guia de fundamentos drscheme
Tema 1: Introducción a la programación funcional.
Asignación n°4
Problemas "1er CusContest"
Examen trianual informatica
Tema 7: Funciones de orden superior en Haskell
Algoritmos y Estructura de Datos
2 algoritmos-1
1. vers. cap-3_tipos_dedatos
1. vers. cap-3_tipos_dedatos
lazy evaluation parte2 - temas avanzado.pdf
Electrónica: circuitos combinacionales
Como Programar
Matematicas aplicadas a la computacion
Teorico1
Tema3
tutorial y Guia de fundamentos drscheme
Publicidad

Más de José A. Alonso (20)

PDF
Tema 12: Analizadores sintácticos funcionales.
PDF
Tema 23: Técnicas de diseño descendente de algoritmos
PDF
I1M-T19: El TAD de los árboles de búsqueda
PDF
I1M-T17: El TAD de los conjuntos
PDF
Panorama de la demostración asistida por ordenador
PDF
LMF-T6: Sintaxis y semántica de la lógica de primer orden
PDF
LMF-T6: Sintaxis y semántica de la lógica de primer orden
PDF
LMF-T5b: Aplicaciones de la lógica proposicional
PDF
LMF-T5: Resolución proposicional
PDF
LMF-T4: Formas normales
PDF
LMF-T3: Tableros semánticos
PDF
LMF-T2: Deducción natural proposicional
PDF
I1M-T21: El TAD de los polinomios en Haskell
PDF
LMF-T1: Sintaxis y semántica de la lógica proposicional
PDF
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
PDF
LI-T6: Sintaxis y semántica de la lógica de primer orden
PDF
LI-T5b: Algoritmos para SAT. Aplicaciones
PDF
Panorama del razonamiento automático
PDF
LI -T5: Resolución proposicional
PDF
I1M2010-T24: Programación dinámica en Haskell
Tema 12: Analizadores sintácticos funcionales.
Tema 23: Técnicas de diseño descendente de algoritmos
I1M-T19: El TAD de los árboles de búsqueda
I1M-T17: El TAD de los conjuntos
Panorama de la demostración asistida por ordenador
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5: Resolución proposicional
LMF-T4: Formas normales
LMF-T3: Tableros semánticos
LMF-T2: Deducción natural proposicional
I1M-T21: El TAD de los polinomios en Haskell
LMF-T1: Sintaxis y semántica de la lógica proposicional
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T5b: Algoritmos para SAT. Aplicaciones
Panorama del razonamiento automático
LI -T5: Resolución proposicional
I1M2010-T24: Programación dinámica en Haskell

Último (20)

PDF
Escuela de Negocios - Robert kiyosaki Ccesa007.pdf
PDF
Conecta con la Motivacion - Brian Tracy Ccesa007.pdf
PDF
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
PDF
Habitos de Ricos - Juan Diego Gomez Ccesa007.pdf
PDF
TRAUMA_Y_RECUPERACION consecuencias de la violencia JUDITH HERMAN
PDF
biología es un libro sobre casi todo el tema de biología
PDF
Punto Critico - Brian Tracy Ccesa007.pdf
PPT
Cosacos y hombres del Este en el Heer.ppt
PDF
COMUNICACION EFECTIVA PARA LA EDUCACION .pdf
DOCX
Tarea De El Colegio Coding For Kids 1 y 2
PDF
GUIA DE: CANVA + INTELIGENCIA ARTIFICIAL
PDF
COMPLETO__PROYECTO_VIVAN LOS NIÑOS Y SUS DERECHOS_EDUCADORASSOS.pdf
DOCX
V UNIDAD - PRIMER GRADO. del mes de agosto
DOCX
III Ciclo _ Plan Anual 2025.docx PARA ESTUDIANTES DE PRIMARIA
PDF
DI, TEA, TDAH.pdf guía se secuencias didacticas
PDF
ciencias-1.pdf libro cuarto basico niños
PPTX
caso clínico iam clinica y semiología l3.pptx
PDF
Escuelas Desarmando una mirada subjetiva a la educación
PDF
el - LIBRO-PACTO-EDUCATIVO-GLOBAL-OIEC.pdf
PDF
ACERTIJO Súper Círculo y la clave contra el Malvado Señor de las Formas. Por ...
Escuela de Negocios - Robert kiyosaki Ccesa007.pdf
Conecta con la Motivacion - Brian Tracy Ccesa007.pdf
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
Habitos de Ricos - Juan Diego Gomez Ccesa007.pdf
TRAUMA_Y_RECUPERACION consecuencias de la violencia JUDITH HERMAN
biología es un libro sobre casi todo el tema de biología
Punto Critico - Brian Tracy Ccesa007.pdf
Cosacos y hombres del Este en el Heer.ppt
COMUNICACION EFECTIVA PARA LA EDUCACION .pdf
Tarea De El Colegio Coding For Kids 1 y 2
GUIA DE: CANVA + INTELIGENCIA ARTIFICIAL
COMPLETO__PROYECTO_VIVAN LOS NIÑOS Y SUS DERECHOS_EDUCADORASSOS.pdf
V UNIDAD - PRIMER GRADO. del mes de agosto
III Ciclo _ Plan Anual 2025.docx PARA ESTUDIANTES DE PRIMARIA
DI, TEA, TDAH.pdf guía se secuencias didacticas
ciencias-1.pdf libro cuarto basico niños
caso clínico iam clinica y semiología l3.pptx
Escuelas Desarmando una mirada subjetiva a la educación
el - LIBRO-PACTO-EDUCATIVO-GLOBAL-OIEC.pdf
ACERTIJO Súper Círculo y la clave contra el Malvado Señor de las Formas. Por ...

Tema 11: Aplicaciones de la programación funcional con Haskell

  • 1. Tema 11: Aplicaciones de programación funcional Informática (2010–11) José A. Alonso Jiménez Grupo de Lógica Computacional Departamento de Ciencias de la Computación e I.A. Universidad de Sevilla
  • 2. IM Tema 11: Aplicaciones de programación funcional Tema 11: Aplicaciones de programación funcional 1. El juego de cifras y letras Introducción Búsqueda de la solución por fuerza bruta Búsqueda combinando generación y evaluación Búsqueda mejorada mediante propiedades algebraicas 2. El problema de las reinas 3. Números de Hamming 2 / 45
  • 3. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Tema 11: Aplicaciones de programación funcional 1. El juego de cifras y letras Introducción Búsqueda de la solución por fuerza bruta Búsqueda combinando generación y evaluación Búsqueda mejorada mediante propiedades algebraicas 2. El problema de las reinas 3. Números de Hamming 3 / 45
  • 4. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Introducción Tema 11: Aplicaciones de programación funcional 1. El juego de cifras y letras Introducción Búsqueda de la solución por fuerza bruta Búsqueda combinando generación y evaluación Búsqueda mejorada mediante propiedades algebraicas 2. El problema de las reinas 3. Números de Hamming 4 / 45
  • 5. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Introducción Presentación del juego Cifras y letras es un programa de Canal Sur que incluye un juego numérico cuya esencia es la siguiente: Dada una sucesión de números naturales y un número objetivo, intentar construir una expresión cuyo valor es el objetivo combinando los números de la sucesión usando suma, resta, multiplicación, división y paréntesis. Cada número de la sucesión puede usarse como máximo una vez. Además, todos los números, incluyendo los resultados intermedios tienen que ser enteros positivos (1,2,3,. . . ). Ejemplos Dada la sucesión 1, 3, 7, 10, 25, 50 y el objetivo 765, una solución es (1+50)*(25−10). Para el problema anterior, existen 780 soluciones. Con la sucesión anterior y el objetivo 831, no hay solución. 5 / 45
  • 6. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Introducción Formalización del problema: Operaciones Las operaciones son sumar, restar, multiplicar o dividir. data Op = Sum | Res | Mul | Div instance Show Op where show Sum = "+" show Res = "-" show Mul = "*" show Div = "/" ops es la lista de las operaciones. ops :: [Op] ops = [Sum,Res,Mul,Div] 6 / 45
  • 7. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Introducción Operaciones válidas (valida o x y) se verifica si la operación o aplicada a los números naturales x e y da un número natural. Por ejemplo, valida Res 5 3 True valida Res 3 5 False valida Div 6 3 True valida Div 6 4 False valida :: Op -> Int -> Int -> Bool valida Sum _ _ = True valida Res x y = x > y valida Mul _ _ = True valida Div x y = y /= 0 && x `mod` y == 0 7 / 45
  • 8. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Introducción Aplicación de operaciones (aplica o x y) es el resultado de aplicar la operación o a los números naturales x e y. Por ejemplo, aplica Sum 2 3 5 aplica Div 6 3 2 aplica :: Op -> Int -> Int -> Int aplica Sum x y = x + y aplica Res x y = x - y aplica Mul x y = x * y aplica Div x y = x `div` y 8 / 45
  • 9. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Introducción Expresiones Las expresiones son números enteros o aplicaciones de operaciones a dos expresiones. data Expr = Num Int | Apl Op Expr Expr instance Show Expr where show (Num n) = show n show (Apl o i d) = parentesis i ++ show o ++ parentesis d where parentesis (Num n) = show n parentesis e = "(" ++ show e ++ ")" Ejemplo: Expresión correspondiente a (1+50)*(25−10) ejExpr :: Expr ejExpr = Apl Mul e1 e2 where e1 = Apl Sum (Num 1) (Num 50) e2 = Apl Res (Num 25) (Num 10) 9 / 45
  • 10. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Introducción Números de una expresión (numeros e) es la lista de los números que aparecen en la expresión e. Por ejemplo, *Main> numeros (Apl Mul (Apl Sum (Num 2) (Num 3)) (Num 7)) [2,3,7] numeros :: Expr -> [Int] numeros (Num n) = [n] numeros (Apl _ l r) = numeros l ++ numeros r 10 / 45
  • 11. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Introducción Valor de una expresión (valor e) es la lista formada por el valor de la expresión e si todas las operaciones para calcular el valor de e son números positivos y la lista vacía en caso contrario. Por ejemplo, valor (Apl Mul (Apl Sum (Num 2) (Num 3)) (Num 7)) [35] valor (Apl Res (Apl Sum (Num 2) (Num 3)) (Num 7)) [] valor (Apl Sum (Apl Res (Num 2) (Num 3)) (Num 7)) [] valor :: Expr -> [Int] valor (Num n) = [n | n > 0] valor (Apl o i d) = [aplica o x y | x <- valor i , y <- valor d , valida o x y] 11 / 45
  • 12. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Introducción Funciones combinatorias: Sublistas (sublistas xs) es la lista de las sublistas de xs. Por ejemplo, *Main> sublistas "bc" ["","c","b","bc"] *Main> sublistas "abc" ["","c","b","bc","a","ac","ab","abc"] sublistas :: [a] -> [[a]] sublistas [] = [[]] sublistas (x:xs) = yss ++ map (x:) yss where yss = sublistas xs 12 / 45
  • 13. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Introducción Funciones combinatoria: Intercalado (intercala x ys) es la lista de las listas obtenidas intercalando x entre los elementos de ys. Por ejemplo, intercala 'x' "bc" ["xbc","bxc","bcx"] intercala 'x' "abc" ["xabc","axbc","abxc","abcx"] intercala :: a -> [a] -> [[a]] intercala x [] = [[x]] intercala x (y:ys) = (x:y:ys) : map (y:) (intercala x ys) 13 / 45
  • 14. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Introducción Funciones combinatoria: Permutaciones (permutaciones xs) es la lista de las permutaciones de xs. Por ejemplo, *Main> permutaciones "bc" ["bc","cb"] *Main> permutaciones "abc" ["abc","bac","bca","acb","cab","cba"] permutaciones :: [a] -> [[a]] permutaciones [] = [[]] permutaciones (x:xs) = concat (map (intercala x) (permutaciones xs)) 14 / 45
  • 15. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Introducción Funciones combinatoria: Elecciones (elecciones xs) es la lista formada por todas las sublistas de xs en cualquier orden. Por ejemplo, *Main> elecciones "abc" ["","c","b","bc","cb","a","ac","ca","ab","ba", "abc","bac","bca","acb","cab","cba"] elecciones :: [a] -> [[a]] elecciones xs = concat (map permutaciones (sublistas xs)) 15 / 45
  • 16. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Introducción Reconocimiento de las soluciones (solucion e ns n) se verifica si la expresión e es una solución para la sucesión ns y objetivo n; es decir. si los números de e es una posible elección de ns y el valor de e es n. Por ejemplo, solucion ejExpr [1,3,7,10,25,50] 765 => True solucion :: Expr -> [Int] -> Int -> Bool solucion e ns n = elem (numeros e) (elecciones ns) && valor e == [n] 16 / 45
  • 17. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda de la solución por fuerza bruta Tema 11: Aplicaciones de programación funcional 1. El juego de cifras y letras Introducción Búsqueda de la solución por fuerza bruta Búsqueda combinando generación y evaluación Búsqueda mejorada mediante propiedades algebraicas 2. El problema de las reinas 3. Números de Hamming 17 / 45
  • 18. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda de la solución por fuerza bruta Divisiones de una lista (divisiones xs) es la lista de las divisiones de xs en dos listas no vacías. Por ejemplo, *Main> divisiones "bcd" [("b","cd"),("bc","d")] *Main> divisiones "abcd" [("a","bcd"),("ab","cd"),("abc","d")] divisiones :: [a] -> [([a],[a])] divisiones [] = [] divisiones [_] = [] divisiones (x:xs) = ([x],xs) : [(x:is,ds) | (is,ds) <- divisiones xs] 18 / 45
  • 19. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda de la solución por fuerza bruta Expresiones construibles (expresiones ns) es la lista de todas las expresiones construibles a partir de la lista de números ns. Por ejemplo, *Main> expresiones [2,3,5] [2+(3+5),2-(3+5),2*(3+5),2/(3+5),2+(3-5),2-(3-5), 2*(3-5),2/(3-5),2+(3*5),2-(3*5),2*(3*5),2/(3*5), 2+(3/5),2-(3/5),2*(3/5),2/(3/5),(2+3)+5,(2+3)-5, ... expresiones :: [Int] -> [Expr] expresiones [] = [] expresiones [n] = [Num n] expresiones ns = [e | (is,ds) <- divisiones ns , i <- expresiones is , d <- expresiones ds , e <- combina i d] 19 / 45
  • 20. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda de la solución por fuerza bruta Combinación de expresiones (combina e1 e2) es la lista de las expresiones obtenidas combinando las expresiones e1 y e2 con una operación. Por ejemplo, *Main> combina (Num 2) (Num 3) [2+3,2-3,2*3,2/3] combina :: Expr -> Expr -> [Expr] combina e1 e2 = [Apl o e1 e2 | o <- ops] 20 / 45
  • 21. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda de la solución por fuerza bruta Búsqueda de las soluciones (soluciones ns n) es la lista de las soluciones para la sucesión ns y objetivo n calculadas por fuerza bruta. Por ejemplo, *Main> soluciones [1,3,7,10,25,50] 765 [3*((7*(50-10))-25), ((7*(50-10))-25)*3, ... *Main> length (soluciones [1,3,7,10,25,50] 765) 780 *Main> length (soluciones [1,3,7,10,25,50] 831) 0 soluciones :: [Int] -> Int -> [Expr] soluciones ns n = [e | ns' <- elecciones ns , e <- expresiones ns' , valor e == [n]] 21 / 45
  • 22. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda de la solución por fuerza bruta Estadísticas de la búsqueda por fuerza bruta Estadíticas: *Main> :set +s *Main> head (soluciones [1,3,7,10,25,50] 765) 3*((7*(50-10))-25) (8.47 secs, 400306836 bytes) *Main> length (soluciones [1,3,7,10,25,50] 765) 780 (997.76 secs, 47074239120 bytes) *Main> length (soluciones [1,3,7,10,25,50] 831) 0 (1019.13 secs, 47074535420 bytes) *Main> :unset +s 22 / 45
  • 23. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda combinando generación y evaluación Tema 11: Aplicaciones de programación funcional 1. El juego de cifras y letras Introducción Búsqueda de la solución por fuerza bruta Búsqueda combinando generación y evaluación Búsqueda mejorada mediante propiedades algebraicas 2. El problema de las reinas 3. Números de Hamming 23 / 45
  • 24. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda combinando generación y evaluación Resultados Resultado es el tipo de los pares formados por expresiones válidas y su valor. type Resultado = (Expr,Int) (resultados ns) es la lista de todos los resultados construibles a partir de la lista de números ns. Por ejemplo, *Main> resultados [2,3,5] [(2+(3+5),10), (2*(3+5),16), (2+(3*5),17), (2*(3*5),30), ((2+3)+5,10), ((2+3)*5,25), ((2+3)/5,1), ((2*3)+5,11), ((2*3)-5,1), ((2*3)*5,30)] resultados :: [Int] -> [Resultado] resultados [] = [] resultados [n] = [(Num n,n) | n > 0] resultados ns = [res | (is,ds) <- divisiones ns , ix <- resultados is , dy <- resultados ds , res <- combina' ix dy] 24 / 45
  • 25. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda combinando generación y evaluación Combinación de resultados (combina’ r1 r2) es la lista de los resultados obtenidos combinando los resultados r1 y r2 con una operación. Por ejemplo, *Main> combina' (Num 2,2) (Num 3,3) [(2+3,5),(2*3,6)] *Main> combina' (Num 3,3) (Num 2,2) [(3+2,5),(3-2,1),(3*2,6)] *Main> combina' (Num 2,2) (Num 6,6) [(2+6,8),(2*6,12)] *Main> combina' (Num 6,6) (Num 2,2) [(6+2,8),(6-2,4),(6*2,12),(6/2,3)] combina' :: Resultado -> Resultado -> [Resultado] combina' (i,x) (d,y) = [(Apl o i d, aplica o x y) | o <- ops , valida o x y] 25 / 45
  • 26. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda combinando generación y evaluación Búsqueda combinando generación y evaluación (soluciones’ ns n) es la lista de las soluciones para la sucesión ns y objetivo n calculadas intercalando generación y evaluación. Por ejemplo, *Main> head (soluciones' [1,3,7,10,25,50] 765) 3*((7*(50-10))-25) *Main> length (soluciones' [1,3,7,10,25,50] 765) 780 *Main> length (soluciones' [1,3,7,10,25,50] 831) 0 soluciones' :: [Int] -> Int -> [Expr] soluciones' ns n = [e | ns' <- elecciones ns , (e,m) <- resultados ns' , m == n] 26 / 45
  • 27. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda combinando generación y evaluación Estadísticas de la búsqueda combinada Estadísticas: *Main> head (soluciones' [1,3,7,10,25,50] 765) 3*((7*(50-10))-25) (0.81 secs, 38804220 bytes) *Main> length (soluciones' [1,3,7,10,25,50] 765) 780 (60.73 secs, 2932314020 bytes) *Main> length (soluciones' [1,3,7,10,25,50] 831) 0 (61.68 secs, 2932303088 bytes) 27 / 45
  • 28. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda mejorada mediante propiedades algebraicas Tema 11: Aplicaciones de programación funcional 1. El juego de cifras y letras Introducción Búsqueda de la solución por fuerza bruta Búsqueda combinando generación y evaluación Búsqueda mejorada mediante propiedades algebraicas 2. El problema de las reinas 3. Números de Hamming 28 / 45
  • 29. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda mejorada mediante propiedades algebraicas Aplicaciones válidas (valida’ o x y) se verifica si la operación o aplicada a los números naturales x e y da un número natural, teniendo en cuenta las siguientes reducciones algebraicas x + y = y + x x * y = y * x x * 1 = x 1 * y = y x / 1 = x valida' :: Op -> Int -> Int -> Bool valida' Sum x y = x <= y valida' Res x y = x > y valida' Mul x y = x /= 1 && y /= 1 && x <= y valida' Div x y = y /= 0 && y /= 1 && x `mod` y == 0 29 / 45
  • 30. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda mejorada mediante propiedades algebraicas Resultados válidos construibles (resultados’ ns) es la lista de todos los resultados válidos construibles a partir de la lista de números ns. Por ejemplo, *Main> resultados' [5,3,2] [(5-(3-2),4),((5-3)+2,4),((5-3)*2,4),((5-3)/2,1)] resultados' :: [Int] -> [Resultado] resultados' [] = [] resultados' [n] = [(Num n,n) | n > 0] resultados' ns = [res | (is,ds) <- divisiones ns , ix <- resultados' is , dy <- resultados' ds , res <- combina'' ix dy] 30 / 45
  • 31. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda mejorada mediante propiedades algebraicas Combinación de resultados válidos (combina” r1 r2) es la lista de los resultados válidos obtenidos combinando los resultados r1 y r2 con una operación. Por ejemplo, combina'' (Num 2,2) (Num 3,3) => [(2+3,5),(2*3,6)] combina'' (Num 3,3) (Num 2,2) => [(3-2,1)] combina'' (Num 2,2) (Num 6,6) => [(2+6,8),(2*6,12)] combina'' (Num 6,6) (Num 2,2) => [(6-2,4),(6/2,3)] combina'' :: Resultado -> Resultado -> [Resultado] combina'' (i,x) (d,y) = [(Apl o i d, aplica o x y) | o <- ops , valida' o x y] 31 / 45
  • 32. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda mejorada mediante propiedades algebraicas Búsqueda mejorada mediante propiedades algebraicas (soluciones” ns n) es la lista de las soluciones para la sucesión ns y objetivo n calculadas intercalando generación y evaluación y usando las mejoras aritméticas. Por ejemplo, *Main> head (soluciones'' [1,3,7,10,25,50] 765) 3*((7*(50-10))-25) *Main> length (soluciones'' [1,3,7,10,25,50] 765) 49 *Main> length (soluciones'' [1,3,7,10,25,50] 831) 0 soluciones'' :: [Int] -> Int -> [Expr] soluciones'' ns n = [e | ns' <- elecciones ns , (e,m) <- resultados' ns' , m == n] 32 / 45
  • 33. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda mejorada mediante propiedades algebraicas Estadísticas de la búsqueda mejorada Estadísticas: *Main> head (soluciones'' [1,3,7,10,25,50] 765) 3*((7*(50-10))-25) (0.40 secs, 16435156 bytes) *Main> length (soluciones'' [1,3,7,10,25,50] 765) 49 (10.30 secs, 460253716 bytes) *Main> length (soluciones'' [1,3,7,10,25,50] 831) 0 (10.26 secs, 460253908 bytes)Ÿ 33 / 45
  • 34. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda mejorada mediante propiedades algebraicas Comparación de las búsquedas Comparación de las búsquedad problema de dados [1,3,7,10,25,50] obtener 765. Búsqueda de la primera solución: +---------------------+ | segs. | bytes | +--------------+-------+-------------+ | soluciones | 8.47 | 400.306.836 | | soluciones' | 0.81 | 38.804.220 | | soluciones'' | 0.40 | 16.435.156 | +--------------+-------+-------------+ 34 / 45
  • 35. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda mejorada mediante propiedades algebraicas Comparación de las búsquedas Búsqueda de todas las soluciones: +--------+----------------+ | segs. | bytes | +--------------+--------+----------------+ | soluciones | 997.76 | 47.074.239.120 | | soluciones' | 60.73 | 2.932.314.020 | | soluciones'' | 10.30 | 460.253.716 | +--------------+--------+----------------+ 35 / 45
  • 36. IM Tema 11: Aplicaciones de programación funcional El juego de cifras y letras Búsqueda mejorada mediante propiedades algebraicas Comparación de las búsquedas Comprobación de que dados [1,3,7,10,25,50] no puede obtenerse 831 +---------+----------------+ | segs. | bytes | +--------------+---------+----------------+ | soluciones | 1019.13 | 47.074.535.420 | | soluciones' | 61.68 | 2.932.303.088 | | soluciones'' | 10.26 | 460.253.908 | +--------------+---------+----------------+ 36 / 45
  • 37. IM Tema 11: Aplicaciones de programación funcional El problema de las reinas Tema 11: Aplicaciones de programación funcional 1. El juego de cifras y letras 2. El problema de las reinas 3. Números de Hamming 37 / 45
  • 38. IM Tema 11: Aplicaciones de programación funcional El problema de las reinas El problema de las N reinas Enunciado: Colocar N reinas en un tablero rectangular de dimensiones N por N de forma que no se encuentren más de una en la misma línea: horizontal, vertical o diagonal. El problema se representa en el módulo Reinas. Importa la diferencia de conjuntos () del módulo List: module Reinas where import Data.List (()) El tablero se representa por una lista de números que indican las filas donde se han colocado las reinas. Por ejemplo, [3,5] indica que se han colocado las reinas (1,3) y (2,5). type Tablero = [Int] 38 / 45
  • 39. IM Tema 11: Aplicaciones de programación funcional El problema de las reinas El problema de las N reinas reinas n es la lista de soluciones del problema de las N reinas. Por ejemplo, reinas 4 [[3,1,4,2],[2,4,1,3]]. La primera solución [3,1,4,2] se interpreta como R R R R reinas :: Int -> [Tablero] reinas n = aux n where aux 0 = [[]] aux (m+1) = [r:rs | rs <- aux m, r <- ([1..n] rs), noAtaca r rs 1] 39 / 45
  • 40. IM Tema 11: Aplicaciones de programación funcional El problema de las reinas El problema de las N reinas noAtaca r rs d se verifica si la reina r no ataca a niguna de las de la lista rs donde la primera de la lista está a una distancia horizontal d. noAtaca :: Int -> Tablero -> Int -> Bool noAtaca _ [] _ = True noAtaca r (a:rs) distH = abs(r-a) /= distH && noAtaca r rs (distH+1) 40 / 45
  • 41. IM Tema 11: Aplicaciones de programación funcional Números de Hamming Tema 11: Aplicaciones de programación funcional 1. El juego de cifras y letras 2. El problema de las reinas 3. Números de Hamming 41 / 45
  • 42. IM Tema 11: Aplicaciones de programación funcional Números de Hamming Números de Hamming Enunciado: Los números de Hamming forman una sucesión estrictamente creciente de números que cumplen las siguientes condiciones: 1. El número 1 está en la sucesión. 2. Si x está en la sucesión, entonces 2x , 3x y 5x también están. 3. Ningún otro número está en la sucesión. hamming es la sucesión de Hamming. Por ejemplo, take 12 hamming [1,2,3,4,5,6,8,9,10,12,15,16] hamming :: [Int] hamming = 1 : mezcla3 [2*i | i <- hamming] [3*i | i <- hamming] [5*i | i <- hamming] 42 / 45
  • 43. IM Tema 11: Aplicaciones de programación funcional Números de Hamming Números de Hamming mezcla3 xs ys zs es la lista obtenida mezclando las listas ordenadas xs, ys y zs y eliminando los elementos duplicados. Por ejemplo, Main> mezcla3 [2,4,6,8,10] [3,6,9,12] [5,10] [2,3,4,5,6,8,9,10,12] mezcla3 :: [Int] -> [Int] -> [Int] -> [Int] mezcla3 xs ys zs = mezcla2 xs (mezcla2 ys zs) 43 / 45
  • 44. IM Tema 11: Aplicaciones de programación funcional Números de Hamming Números de Hamming mezcla2 xs ys zs es la lista obtenida mezclando las listas ordenadas xs e ys y eliminando los elementos duplicados. Por ejemplo, Main> mezcla2 [2,4,6,8,10,12] [3,6,9,12] [2,3,4,6,8,9,10,12] mezcla2 :: [Int] -> [Int] -> [Int] mezcla2 p@(x:xs) q@(y:ys) | x < y = x:mezcla2 xs q | x > y = y:mezcla2 p ys | otherwise = x:mezcla2 xs ys mezcla2 [] ys = ys mezcla2 xs [] = xs 44 / 45
  • 45. IM Tema 11: Aplicaciones de programación funcional Bibliografía Bibliografía 1. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 11: The countdown problem. 2. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 13: Puzzles y solitarios. 45 / 45