SlideShare una empresa de Scribd logo
1 de 30
Descargar para leer sin conexión
PD Tema 4: Aplicaciones de programación funcional
Programación declarativa (2007–08)
Tema 4: Aplicaciones de programación funcional
José A. Alonso Jiménez
Grupo de Lógica Computacional
Departamento de Ciencias de la Computación e I.A.
Universidad de Sevilla
1 / 30
PD Tema 4: Aplicaciones de programación funcional
Tema 4: Aplicaciones de programación funcional
1. Funciones combinatorias
Segmentos y sublistas
Permutaciones y combinaciones
El patrón alias @
2. Rompecabezas lógicos
El problema de las reinas
Números de Hamming
3. Búsqueda en grafos
Búsqueda en profundidad grafos
2 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
Segmentos y sublistas
Tema 4: Aplicaciones de programación funcional
1. Funciones combinatorias
Segmentos y sublistas
Permutaciones y combinaciones
El patrón alias @
2. Rompecabezas lógicos
3. Búsqueda en grafos
3 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
Segmentos y sublistas
Segmentos iniciales
iniciales l es la lista de los segmentos iniciales de la lista l.
Por ejemplo,
iniciales [2,3,4] [[],[2],[2,3],[2,3,4]]
iniciales [1,2,3,4] [[],[1],[1,2],[1,2,3],[1,2,3,4]]
iniciales :: [a] -> [[a]]
iniciales [] = [[]]
iniciales (x:xs) = [] : [x:ys | ys <- iniciales xs]
4 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
Segmentos y sublistas
Segmentos finales
finales l es la lista de los segmentos finales de la lista l. Por
ejemplo,
finales [2,3,4] [[2,3,4],[3,4],[4],[]]
finales [1,2,3,4] [[1,2,3,4],[2,3,4],[3,4],[4],[]]
finales :: [a] -> [[a]]
finales [] = [[]]
finales (x:xs) = (x:xs) : finales xs
5 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
Segmentos y sublistas
Segmentos
segmentos l es la lista de los segmentos de la lista l. Por
ejemplo,
Main> segmentos [2,3,4]
[[],[4],[3],[3,4],[2],[2,3],[2,3,4]]
Main> segmentos [1,2,3,4]
[[],[4],[3],[3,4],[2],[2,3],[2,3,4],[1],[1,2],[1,2,3],[1,2
segmentos :: [a] -> [[a]]
segmentos [] = [[]]
segmentos (x:xs) =
segmentos xs ++ [x:ys | ys <- iniciales xs]
6 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
Segmentos y sublistas
Sublistas
sublistas l es la lista de las sublistas de la lista l. Por ejemplo,
Main> sublistas [2,3,4]
[[2,3,4],[2,3],[2,4],[2],[3,4],[3],[4],[]]
Main> sublistas [1,2,3,4]
[[1,2,3,4],[1,2,3],[1,2,4],[1,2],[1,3,4],[1,3],[1,4],[1],
[2,3,4], [2,3], [2,4], [2], [3,4], [3], [4], []]
sublistas :: [a] -> [[a]]
sublistas [] = [[]]
sublistas (x:xs) = [x:ys | ys <- sub] ++ sub
where sub = sublistas xs
7 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
Permutaciones y combinaciones
Tema 4: Aplicaciones de programación funcional
1. Funciones combinatorias
Segmentos y sublistas
Permutaciones y combinaciones
El patrón alias @
2. Rompecabezas lógicos
3. Búsqueda en grafos
8 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
Permutaciones y combinaciones
Permutaciones
permutaciones l es la lista de las permutaciones de la lista l.
Por ejemplo,
Main> permutaciones [2,3]
[[2,3],[3,2]]
Main> permutaciones [1,2,3]
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
Definición recursiva:
permutaciones :: Eq a => [a] -> [[a]]
permutaciones [] = [[]]
permutaciones xs =
[a:p | a <- xs, p <- permutaciones(xs  [a])]
xs  ys es la lista de los elementos de xs que no pertenecen a
ys. Para usarla, hay que importarla: import Data.List (())
9 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
Permutaciones y combinaciones
Permutaciones
Definición alternativa:
permutaciones' :: [a] -> [[a]]
permutaciones' [] = [[]]
permutaciones' (x:xs) = [zs | ys <- permutaciones' xs,
zs <- intercala x ys]
donde intercala x l es la lista de las listas obtenidas
intercalando x entre los elementos de la lista l. Por ejemplo,
intercala 1 [2,3] [[1,2,3],[2,1,3],[2,3,1]]
intercala :: a -> [a] -> [[a]]
intercala e [] = [[e]]
intercala e (x:xs) =
(e:x:xs) : [(x:ys) | ys <- (intercala e xs)]
10 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
Permutaciones y combinaciones
Permutaciones
La segunda definición es más eficiente. En efecto,
Main> :set +s
Main> permutaciones [1,2,3]
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
(429 reductions, 812 cells)
Main> permutaciones' [1,2,3]
[[1,2,3],[2,1,3],[2,3,1],[1,3,2],[3,1,2],[3,2,1]]
(267 reductions, 485 cells)
11 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
Permutaciones y combinaciones
Combinaciones
combinaciones n l es la lista de las combinaciones n–arias de
la lista l. Por ejemplo,
combinaciones 2 [1,2,3,4] [[1,2],[1,3],[1,4],[2,3],[2,4
Definición mediante sublistas:
combinaciones :: Int -> [a] -> [[a]]
combinaciones n xs =
[ys | ys <- sublistas xs, length ys == n]
12 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
Permutaciones y combinaciones
Combinaciones
Definición directa:
combinaciones' :: Int -> [a] -> [[a]]
combinaciones' 0 _ = [[]]
combinaciones' _ [] = []
combinaciones' (n+1) (x:xs) =
[x:ys | ys <- combinaciones' n xs] ++
combinaciones' (n+1) xs
Comparación de eficiencia:
Main> combinaciones 1 [1..10]
[[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]]
(42363 reductions, 52805 cells)
Main> combinaciones' 1 [1..10]
[[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]]
(775 reductions, 1143 cells) 13 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
El patrón alias @
Tema 4: Aplicaciones de programación funcional
1. Funciones combinatorias
Segmentos y sublistas
Permutaciones y combinaciones
El patrón alias @
2. Rompecabezas lógicos
3. Búsqueda en grafos
14 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
El patrón alias @
El patrón alias @
Definición de finales con patrones:
finales_1 [] = [[]]
finales_1 (x:xs) = (x:xs) : finales_1 xs
Definición de finales con selectores:
finales_2 [] = [[]]
finales_2 xs = xs : finales_2 (tail xs)
Definición de finales con alias::
finales_3 [] = [[]]
finales_3 l@(x:xs) = l : finales_3 xs
El patrón l@(x:xs) se lee “l como x:xs”.
15 / 30
PD Tema 4: Aplicaciones de programación funcional
Funciones combinatorias
El patrón alias @
Definición con alias
dropWhile p l es la lista l sin los elementos iniciales que
verifican el predicado p. Por ejemplo,
dropWhile even [2,4,6,7,8,9] [7,8,9]
Prelude
dropWhile :: (a -> Bool) -> [a] -> [a]
dropWhile p [] = []
dropWhile p ys@(x:xs)
| p x = dropWhile p xs
| otherwise = ys
16 / 30
PD Tema 4: Aplicaciones de programación funcional
Rompecabezas lógicos
El problema de las reinas
Tema 4: Aplicaciones de programación funcional
1. Funciones combinatorias
2. Rompecabezas lógicos
El problema de las reinas
Números de Hamming
3. Búsqueda en grafos
17 / 30
PD Tema 4: Aplicaciones de programación funcional
Rompecabezas lógicos
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]
18 / 30
PD Tema 4: Aplicaciones de programación funcional
Rompecabezas lógicos
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]
19 / 30
PD Tema 4: Aplicaciones de programación funcional
Rompecabezas lógicos
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)
Esta solución está basada en [?] p. 95.
20 / 30
PD Tema 4: Aplicaciones de programación funcional
Rompecabezas lógicos
Números de Hamming
Tema 4: Aplicaciones de programación funcional
1. Funciones combinatorias
2. Rompecabezas lógicos
El problema de las reinas
Números de Hamming
3. Búsqueda en grafos
21 / 30
PD Tema 4: Aplicaciones de programación funcional
Rompecabezas lógicos
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]
22 / 30
PD Tema 4: Aplicaciones de programación funcional
Rompecabezas lógicos
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)
23 / 30
PD Tema 4: Aplicaciones de programación funcional
Rompecabezas lógicos
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
24 / 30
PD Tema 4: Aplicaciones de programación funcional
Búsqueda en grafos
Búsqueda en profundidad grafos
Tema 4: Aplicaciones de programación funcional
1. Funciones combinatorias
2. Rompecabezas lógicos
3. Búsqueda en grafos
Búsqueda en profundidad grafos
25 / 30
PD Tema 4: Aplicaciones de programación funcional
Búsqueda en grafos
Búsqueda en profundidad grafos
Representación de grafos
Un grafo de tipo v es un tipo de datos compuesto por la lista de
vértices y la función que asigna a cada vértice la lista de sus
sucesores.
data Grafo v = G [v] (v -> [v])
26 / 30
PD Tema 4: Aplicaciones de programación funcional
Búsqueda en grafos
Búsqueda en profundidad grafos
Representación de grafos
ej_grafo es la representación del grafo
ej_grafo = G [1..5] suc
where suc 1 = [2,3]
suc 2 = [4]
suc 3 = [4]
suc _ = []
27 / 30
PD Tema 4: Aplicaciones de programación funcional
Búsqueda en grafos
Búsqueda en profundidad grafos
Búsqueda de los caminos en un grafo
caminosDesde g o te vis es la lista de los caminos en el grafo
g desde el vértice origen o hasta vértices finales (i.e los que
verifican el test de encontrado te) sin volver a pasar por los
vértices visitados vis. Por ejemplo,
caminosDesde ej_grafo 1 (==4) [] [[4,2,1],[4,3,1]]
caminosDesde :: Eq a => Grafo a -> a -> (a -> Bool) -> [a]
caminosDesde g o te vis
| te o = [o:vis]
| otherwise = concat [caminosDesde g o' te (o:vis)
| o' <- suc o,
notElem o' vis]
where G _ suc = g
28 / 30
PD Tema 4: Aplicaciones de programación funcional
Búsqueda en grafos
Búsqueda en profundidad grafos
Búsqueda de un camino en un grafo
camino g u v es un camino (i.e una lista de vértices tales que
cada uno es un sucesor del anterior) en el grafo g desde el vértice
u al v. Por ejemplo,
camino ej_grafo 1 4 [4,2,1]
camino :: Eq a => Grafo a -> a -> a -> [a]
camino g u v = head (caminosDesde g u (== v) [])
29 / 30
PD Tema 4: Aplicaciones de programación funcional
Búsqueda en grafos
Búsqueda en profundidad grafos
Bibliografía
1. H. C. Cunningham (2007) Notes on Functional Programming
with Haskell.
2. J. Fokker (1996) Programación funcional.
3. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J. Gallardo (2004).
Razonando con Haskell (Un curso sobre programación funcional).
4. S. Thompson (1999) Haskell: The Craft of Functional
Programming.
5. E.P. Wentworth (1994) Introduction to Funcional Programming.
30 / 30

Más contenido relacionado

La actualidad más candente

Poliformismo
PoliformismoPoliformismo
PoliformismoSa_Van
 
ANALIZADOR SINTACTICO: INTRODUCION, CONCEPTOS, CARACTERISTICAS
ANALIZADOR SINTACTICO: INTRODUCION, CONCEPTOS, CARACTERISTICAS ANALIZADOR SINTACTICO: INTRODUCION, CONCEPTOS, CARACTERISTICAS
ANALIZADOR SINTACTICO: INTRODUCION, CONCEPTOS, CARACTERISTICAS Infomania pro
 
Document Object Model (DOM)
Document Object Model (DOM)Document Object Model (DOM)
Document Object Model (DOM)GOPAL BASAK
 
Modelos y Lenguajes Para Computación Paralela
Modelos y Lenguajes Para Computación ParalelaModelos y Lenguajes Para Computación Paralela
Modelos y Lenguajes Para Computación ParalelaRicardo Montañana
 
Unidad 6 Lenguaje Sql 3 (Restricciones Ddl Avanzado)
Unidad 6 Lenguaje Sql 3 (Restricciones Ddl Avanzado)Unidad 6 Lenguaje Sql 3 (Restricciones Ddl Avanzado)
Unidad 6 Lenguaje Sql 3 (Restricciones Ddl Avanzado)Sergio Sanchez
 
Clases abstractas e interfaces en java
Clases abstractas e interfaces en javaClases abstractas e interfaces en java
Clases abstractas e interfaces en javajcalmeida2
 
Programación extrema xp
Programación extrema xpProgramación extrema xp
Programación extrema xpJose Luis Dorao
 
Cuadro comparativo
Cuadro comparativoCuadro comparativo
Cuadro comparativojorge paez
 
Ingenieria de Requerimientos
Ingenieria de RequerimientosIngenieria de Requerimientos
Ingenieria de Requerimientoskaresha3
 
Web Development with Python and Django
Web Development with Python and DjangoWeb Development with Python and Django
Web Development with Python and DjangoMichael Pirnat
 
Clases y objetos de java
Clases y objetos de javaClases y objetos de java
Clases y objetos de javainnovalabcun
 
Aprendiendo uml en 24 horas
Aprendiendo uml en 24 horasAprendiendo uml en 24 horas
Aprendiendo uml en 24 horasstill01
 
Beginners PHP Tutorial
Beginners PHP TutorialBeginners PHP Tutorial
Beginners PHP Tutorialalexjones89
 
Conceptos Básicos de Sistemas Operativos
Conceptos Básicos de Sistemas OperativosConceptos Básicos de Sistemas Operativos
Conceptos Básicos de Sistemas Operativosfvaldivieso
 
OCL en Arquitecturas dirigidas por Modelos
OCL en Arquitecturas dirigidas por ModelosOCL en Arquitecturas dirigidas por Modelos
OCL en Arquitecturas dirigidas por ModelosRicardo Tesoriero
 

La actualidad más candente (20)

Poliformismo
PoliformismoPoliformismo
Poliformismo
 
DOM HTML Javascript
DOM HTML JavascriptDOM HTML Javascript
DOM HTML Javascript
 
ANALIZADOR SINTACTICO: INTRODUCION, CONCEPTOS, CARACTERISTICAS
ANALIZADOR SINTACTICO: INTRODUCION, CONCEPTOS, CARACTERISTICAS ANALIZADOR SINTACTICO: INTRODUCION, CONCEPTOS, CARACTERISTICAS
ANALIZADOR SINTACTICO: INTRODUCION, CONCEPTOS, CARACTERISTICAS
 
Taller de Base de Datos - Unidad 6 SQL procedural
Taller de Base de Datos - Unidad 6 SQL proceduralTaller de Base de Datos - Unidad 6 SQL procedural
Taller de Base de Datos - Unidad 6 SQL procedural
 
DIAGRAMAS DE CLASE
DIAGRAMAS DE CLASEDIAGRAMAS DE CLASE
DIAGRAMAS DE CLASE
 
Document Object Model (DOM)
Document Object Model (DOM)Document Object Model (DOM)
Document Object Model (DOM)
 
Modelos y Lenguajes Para Computación Paralela
Modelos y Lenguajes Para Computación ParalelaModelos y Lenguajes Para Computación Paralela
Modelos y Lenguajes Para Computación Paralela
 
Autómata de Pila
Autómata de Pila Autómata de Pila
Autómata de Pila
 
Unidad 6 Lenguaje Sql 3 (Restricciones Ddl Avanzado)
Unidad 6 Lenguaje Sql 3 (Restricciones Ddl Avanzado)Unidad 6 Lenguaje Sql 3 (Restricciones Ddl Avanzado)
Unidad 6 Lenguaje Sql 3 (Restricciones Ddl Avanzado)
 
Clases abstractas e interfaces en java
Clases abstractas e interfaces en javaClases abstractas e interfaces en java
Clases abstractas e interfaces en java
 
Programación extrema xp
Programación extrema xpProgramación extrema xp
Programación extrema xp
 
Cuadro comparativo
Cuadro comparativoCuadro comparativo
Cuadro comparativo
 
Ingenieria de Requerimientos
Ingenieria de RequerimientosIngenieria de Requerimientos
Ingenieria de Requerimientos
 
Web Development with Python and Django
Web Development with Python and DjangoWeb Development with Python and Django
Web Development with Python and Django
 
Clases y objetos de java
Clases y objetos de javaClases y objetos de java
Clases y objetos de java
 
Aprendiendo uml en 24 horas
Aprendiendo uml en 24 horasAprendiendo uml en 24 horas
Aprendiendo uml en 24 horas
 
Beginners PHP Tutorial
Beginners PHP TutorialBeginners PHP Tutorial
Beginners PHP Tutorial
 
Cookie and session
Cookie and sessionCookie and session
Cookie and session
 
Conceptos Básicos de Sistemas Operativos
Conceptos Básicos de Sistemas OperativosConceptos Básicos de Sistemas Operativos
Conceptos Básicos de Sistemas Operativos
 
OCL en Arquitecturas dirigidas por Modelos
OCL en Arquitecturas dirigidas por ModelosOCL en Arquitecturas dirigidas por Modelos
OCL en Arquitecturas dirigidas por Modelos
 

Similar a Haskell

Similar a Haskell (20)

Tema 6: Definiciones por recursión en Haskell
Tema 6: Definiciones por recursión en Haskell Tema 6: Definiciones por recursión en Haskell
Tema 6: Definiciones por recursión en Haskell
 
Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.Tema 1: Introducción a la programación funcional.
Tema 1: Introducción a la programación funcional.
 
9. listas y for-in
9.  listas y for-in9.  listas y for-in
9. listas y for-in
 
Capitulo i modelos_matematicos_y_errores,_parte_1[1]
Capitulo i modelos_matematicos_y_errores,_parte_1[1]Capitulo i modelos_matematicos_y_errores,_parte_1[1]
Capitulo i modelos_matematicos_y_errores,_parte_1[1]
 
Programacion logica
Programacion logicaProgramacion logica
Programacion logica
 
Tema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con HaskellTema 11: Aplicaciones de la programación funcional con Haskell
Tema 11: Aplicaciones de la programación funcional con Haskell
 
Semana 02 software libre maxima
Semana 02 software libre maximaSemana 02 software libre maxima
Semana 02 software libre maxima
 
Apunte practico 1
Apunte practico 1Apunte practico 1
Apunte practico 1
 
Articulo en r
Articulo en rArticulo en r
Articulo en r
 
Semana 10 clase 18
Semana 10 clase 18Semana 10 clase 18
Semana 10 clase 18
 
ESTRUCTURA DE DATOS (I Bimestre Abril Agosto 2011)
ESTRUCTURA DE DATOS (I Bimestre Abril Agosto 2011)ESTRUCTURA DE DATOS (I Bimestre Abril Agosto 2011)
ESTRUCTURA DE DATOS (I Bimestre Abril Agosto 2011)
 
Sesion 5
Sesion 5Sesion 5
Sesion 5
 
Curso_de_introduccion_al_matlab.ppt
Curso_de_introduccion_al_matlab.pptCurso_de_introduccion_al_matlab.ppt
Curso_de_introduccion_al_matlab.ppt
 
Matlab introducción
Matlab   introducciónMatlab   introducción
Matlab introducción
 
Matlab introducción
Matlab   introducciónMatlab   introducción
Matlab introducción
 
Matlab introducción
Matlab   introducciónMatlab   introducción
Matlab introducción
 
Silabo programación ii 2015-i
Silabo programación ii 2015-iSilabo programación ii 2015-i
Silabo programación ii 2015-i
 
Informatica
InformaticaInformatica
Informatica
 
Mat lab01
Mat lab01Mat lab01
Mat lab01
 
Practica i prolog
Practica i prologPractica i prolog
Practica i prolog
 

Último

EXAMEN ANDROLOGICO O CAPACIDAD REPRODUCTIVA EN EQUINOS.pptx
EXAMEN ANDROLOGICO O CAPACIDAD REPRODUCTIVA  EN EQUINOS.pptxEXAMEN ANDROLOGICO O CAPACIDAD REPRODUCTIVA  EN EQUINOS.pptx
EXAMEN ANDROLOGICO O CAPACIDAD REPRODUCTIVA EN EQUINOS.pptxJhonFonseca16
 
el lugar santo y santisimo final.pptx y sus partes
el lugar santo y santisimo final.pptx y sus partesel lugar santo y santisimo final.pptx y sus partes
el lugar santo y santisimo final.pptx y sus partesAsihleyyanguez
 
Tractos ascendentes y descendentes de la médula
Tractos ascendentes y descendentes de la médulaTractos ascendentes y descendentes de la médula
Tractos ascendentes y descendentes de la méduladianymorales5
 
Fowler, Will. - Santa Anna, héroe o villano [2018].pdf
Fowler, Will. - Santa Anna, héroe o villano [2018].pdfFowler, Will. - Santa Anna, héroe o villano [2018].pdf
Fowler, Will. - Santa Anna, héroe o villano [2018].pdffrank0071
 
Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...
Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...
Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...GloriaMeza12
 
Límites derivadas e integrales y análisis matemático.pptx
Límites derivadas e integrales y análisis matemático.pptxLímites derivadas e integrales y análisis matemático.pptx
Límites derivadas e integrales y análisis matemático.pptxErichManriqueCastill
 
artropodos fusion 2024 clase universidad de chile
artropodos fusion 2024 clase universidad de chileartropodos fusion 2024 clase universidad de chile
artropodos fusion 2024 clase universidad de chilecatabarria8
 
Holland, Tom - Milenio. El fin del mundo y el origen del cristianismo [2010].pdf
Holland, Tom - Milenio. El fin del mundo y el origen del cristianismo [2010].pdfHolland, Tom - Milenio. El fin del mundo y el origen del cristianismo [2010].pdf
Holland, Tom - Milenio. El fin del mundo y el origen del cristianismo [2010].pdffrank0071
 
HISTORIA NATURAL DE LA ENFEREMEDAD: SARAMPION
HISTORIA NATURAL DE LA ENFEREMEDAD: SARAMPIONHISTORIA NATURAL DE LA ENFEREMEDAD: SARAMPION
HISTORIA NATURAL DE LA ENFEREMEDAD: SARAMPIONAleMena14
 
Sternhell & Sznajder & Asheri. - El nacimiento de la ideología fascista [ocr]...
Sternhell & Sznajder & Asheri. - El nacimiento de la ideología fascista [ocr]...Sternhell & Sznajder & Asheri. - El nacimiento de la ideología fascista [ocr]...
Sternhell & Sznajder & Asheri. - El nacimiento de la ideología fascista [ocr]...frank0071
 
ESQUELETO HUMANO ARTICULADO PARA PRIMARIA
ESQUELETO HUMANO ARTICULADO PARA PRIMARIAESQUELETO HUMANO ARTICULADO PARA PRIMARIA
ESQUELETO HUMANO ARTICULADO PARA PRIMARIAjuliocesartolucarami
 
Centro de masa, centro de gravedad y equilibrio.pptx
Centro de masa, centro de gravedad y equilibrio.pptxCentro de masa, centro de gravedad y equilibrio.pptx
Centro de masa, centro de gravedad y equilibrio.pptxErichManriqueCastill
 
registro cardiotocografico interpretacion y valoracion
registro cardiotocografico interpretacion y valoracionregistro cardiotocografico interpretacion y valoracion
registro cardiotocografico interpretacion y valoracionMarcoAntonioJimenez14
 
Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...
Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...
Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...Juan Carlos Fonseca Mata
 
ECOGRAFIA RENAL Y SUS VARIANTES ANATOMICAS NORMALES
ECOGRAFIA RENAL Y SUS VARIANTES ANATOMICAS NORMALESECOGRAFIA RENAL Y SUS VARIANTES ANATOMICAS NORMALES
ECOGRAFIA RENAL Y SUS VARIANTES ANATOMICAS NORMALEScarlasanchez99166
 
Informe Aemet Tornados Sabado Santo Marchena Paradas
Informe Aemet Tornados Sabado Santo Marchena ParadasInforme Aemet Tornados Sabado Santo Marchena Paradas
Informe Aemet Tornados Sabado Santo Marchena ParadasRevista Saber Mas
 
Generalidades de Morfología y del aparato musculoesquelético.pdf
Generalidades de Morfología y del aparato musculoesquelético.pdfGeneralidades de Morfología y del aparato musculoesquelético.pdf
Generalidades de Morfología y del aparato musculoesquelético.pdfJosefinaRojas27
 
METODOS ANTICONCEPTIVOS UNIVERSIDAD SEÑOR DE SIPAN.pptx
METODOS ANTICONCEPTIVOS UNIVERSIDAD SEÑOR DE SIPAN.pptxMETODOS ANTICONCEPTIVOS UNIVERSIDAD SEÑOR DE SIPAN.pptx
METODOS ANTICONCEPTIVOS UNIVERSIDAD SEÑOR DE SIPAN.pptxlilianabarbozavasque
 
Módulo de oftalmología en cirugia general.pptx
Módulo de oftalmología en cirugia general.pptxMódulo de oftalmología en cirugia general.pptx
Módulo de oftalmología en cirugia general.pptxLuisGuzmnHernndez1
 
TERMODINAMICA UNIVERSIDAD NACIONAL DE INGENIERA
TERMODINAMICA UNIVERSIDAD NACIONAL DE INGENIERATERMODINAMICA UNIVERSIDAD NACIONAL DE INGENIERA
TERMODINAMICA UNIVERSIDAD NACIONAL DE INGENIERAdheznolbert
 

Último (20)

EXAMEN ANDROLOGICO O CAPACIDAD REPRODUCTIVA EN EQUINOS.pptx
EXAMEN ANDROLOGICO O CAPACIDAD REPRODUCTIVA  EN EQUINOS.pptxEXAMEN ANDROLOGICO O CAPACIDAD REPRODUCTIVA  EN EQUINOS.pptx
EXAMEN ANDROLOGICO O CAPACIDAD REPRODUCTIVA EN EQUINOS.pptx
 
el lugar santo y santisimo final.pptx y sus partes
el lugar santo y santisimo final.pptx y sus partesel lugar santo y santisimo final.pptx y sus partes
el lugar santo y santisimo final.pptx y sus partes
 
Tractos ascendentes y descendentes de la médula
Tractos ascendentes y descendentes de la médulaTractos ascendentes y descendentes de la médula
Tractos ascendentes y descendentes de la médula
 
Fowler, Will. - Santa Anna, héroe o villano [2018].pdf
Fowler, Will. - Santa Anna, héroe o villano [2018].pdfFowler, Will. - Santa Anna, héroe o villano [2018].pdf
Fowler, Will. - Santa Anna, héroe o villano [2018].pdf
 
Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...
Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...
Sistema Endocrino, rol de los receptores hormonales, hormonas circulantes y l...
 
Límites derivadas e integrales y análisis matemático.pptx
Límites derivadas e integrales y análisis matemático.pptxLímites derivadas e integrales y análisis matemático.pptx
Límites derivadas e integrales y análisis matemático.pptx
 
artropodos fusion 2024 clase universidad de chile
artropodos fusion 2024 clase universidad de chileartropodos fusion 2024 clase universidad de chile
artropodos fusion 2024 clase universidad de chile
 
Holland, Tom - Milenio. El fin del mundo y el origen del cristianismo [2010].pdf
Holland, Tom - Milenio. El fin del mundo y el origen del cristianismo [2010].pdfHolland, Tom - Milenio. El fin del mundo y el origen del cristianismo [2010].pdf
Holland, Tom - Milenio. El fin del mundo y el origen del cristianismo [2010].pdf
 
HISTORIA NATURAL DE LA ENFEREMEDAD: SARAMPION
HISTORIA NATURAL DE LA ENFEREMEDAD: SARAMPIONHISTORIA NATURAL DE LA ENFEREMEDAD: SARAMPION
HISTORIA NATURAL DE LA ENFEREMEDAD: SARAMPION
 
Sternhell & Sznajder & Asheri. - El nacimiento de la ideología fascista [ocr]...
Sternhell & Sznajder & Asheri. - El nacimiento de la ideología fascista [ocr]...Sternhell & Sznajder & Asheri. - El nacimiento de la ideología fascista [ocr]...
Sternhell & Sznajder & Asheri. - El nacimiento de la ideología fascista [ocr]...
 
ESQUELETO HUMANO ARTICULADO PARA PRIMARIA
ESQUELETO HUMANO ARTICULADO PARA PRIMARIAESQUELETO HUMANO ARTICULADO PARA PRIMARIA
ESQUELETO HUMANO ARTICULADO PARA PRIMARIA
 
Centro de masa, centro de gravedad y equilibrio.pptx
Centro de masa, centro de gravedad y equilibrio.pptxCentro de masa, centro de gravedad y equilibrio.pptx
Centro de masa, centro de gravedad y equilibrio.pptx
 
registro cardiotocografico interpretacion y valoracion
registro cardiotocografico interpretacion y valoracionregistro cardiotocografico interpretacion y valoracion
registro cardiotocografico interpretacion y valoracion
 
Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...
Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...
Documento Técnico Base del Inventario de Especies Vegetales Nativas del Estad...
 
ECOGRAFIA RENAL Y SUS VARIANTES ANATOMICAS NORMALES
ECOGRAFIA RENAL Y SUS VARIANTES ANATOMICAS NORMALESECOGRAFIA RENAL Y SUS VARIANTES ANATOMICAS NORMALES
ECOGRAFIA RENAL Y SUS VARIANTES ANATOMICAS NORMALES
 
Informe Aemet Tornados Sabado Santo Marchena Paradas
Informe Aemet Tornados Sabado Santo Marchena ParadasInforme Aemet Tornados Sabado Santo Marchena Paradas
Informe Aemet Tornados Sabado Santo Marchena Paradas
 
Generalidades de Morfología y del aparato musculoesquelético.pdf
Generalidades de Morfología y del aparato musculoesquelético.pdfGeneralidades de Morfología y del aparato musculoesquelético.pdf
Generalidades de Morfología y del aparato musculoesquelético.pdf
 
METODOS ANTICONCEPTIVOS UNIVERSIDAD SEÑOR DE SIPAN.pptx
METODOS ANTICONCEPTIVOS UNIVERSIDAD SEÑOR DE SIPAN.pptxMETODOS ANTICONCEPTIVOS UNIVERSIDAD SEÑOR DE SIPAN.pptx
METODOS ANTICONCEPTIVOS UNIVERSIDAD SEÑOR DE SIPAN.pptx
 
Módulo de oftalmología en cirugia general.pptx
Módulo de oftalmología en cirugia general.pptxMódulo de oftalmología en cirugia general.pptx
Módulo de oftalmología en cirugia general.pptx
 
TERMODINAMICA UNIVERSIDAD NACIONAL DE INGENIERA
TERMODINAMICA UNIVERSIDAD NACIONAL DE INGENIERATERMODINAMICA UNIVERSIDAD NACIONAL DE INGENIERA
TERMODINAMICA UNIVERSIDAD NACIONAL DE INGENIERA
 

Haskell

  • 1. PD Tema 4: Aplicaciones de programación funcional Programación declarativa (2007–08) Tema 4: Aplicaciones de programación funcional José A. Alonso Jiménez Grupo de Lógica Computacional Departamento de Ciencias de la Computación e I.A. Universidad de Sevilla 1 / 30
  • 2. PD Tema 4: Aplicaciones de programación funcional Tema 4: Aplicaciones de programación funcional 1. Funciones combinatorias Segmentos y sublistas Permutaciones y combinaciones El patrón alias @ 2. Rompecabezas lógicos El problema de las reinas Números de Hamming 3. Búsqueda en grafos Búsqueda en profundidad grafos 2 / 30
  • 3. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias Segmentos y sublistas Tema 4: Aplicaciones de programación funcional 1. Funciones combinatorias Segmentos y sublistas Permutaciones y combinaciones El patrón alias @ 2. Rompecabezas lógicos 3. Búsqueda en grafos 3 / 30
  • 4. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias Segmentos y sublistas Segmentos iniciales iniciales l es la lista de los segmentos iniciales de la lista l. Por ejemplo, iniciales [2,3,4] [[],[2],[2,3],[2,3,4]] iniciales [1,2,3,4] [[],[1],[1,2],[1,2,3],[1,2,3,4]] iniciales :: [a] -> [[a]] iniciales [] = [[]] iniciales (x:xs) = [] : [x:ys | ys <- iniciales xs] 4 / 30
  • 5. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias Segmentos y sublistas Segmentos finales finales l es la lista de los segmentos finales de la lista l. Por ejemplo, finales [2,3,4] [[2,3,4],[3,4],[4],[]] finales [1,2,3,4] [[1,2,3,4],[2,3,4],[3,4],[4],[]] finales :: [a] -> [[a]] finales [] = [[]] finales (x:xs) = (x:xs) : finales xs 5 / 30
  • 6. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias Segmentos y sublistas Segmentos segmentos l es la lista de los segmentos de la lista l. Por ejemplo, Main> segmentos [2,3,4] [[],[4],[3],[3,4],[2],[2,3],[2,3,4]] Main> segmentos [1,2,3,4] [[],[4],[3],[3,4],[2],[2,3],[2,3,4],[1],[1,2],[1,2,3],[1,2 segmentos :: [a] -> [[a]] segmentos [] = [[]] segmentos (x:xs) = segmentos xs ++ [x:ys | ys <- iniciales xs] 6 / 30
  • 7. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias Segmentos y sublistas Sublistas sublistas l es la lista de las sublistas de la lista l. Por ejemplo, Main> sublistas [2,3,4] [[2,3,4],[2,3],[2,4],[2],[3,4],[3],[4],[]] Main> sublistas [1,2,3,4] [[1,2,3,4],[1,2,3],[1,2,4],[1,2],[1,3,4],[1,3],[1,4],[1], [2,3,4], [2,3], [2,4], [2], [3,4], [3], [4], []] sublistas :: [a] -> [[a]] sublistas [] = [[]] sublistas (x:xs) = [x:ys | ys <- sub] ++ sub where sub = sublistas xs 7 / 30
  • 8. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias Permutaciones y combinaciones Tema 4: Aplicaciones de programación funcional 1. Funciones combinatorias Segmentos y sublistas Permutaciones y combinaciones El patrón alias @ 2. Rompecabezas lógicos 3. Búsqueda en grafos 8 / 30
  • 9. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias Permutaciones y combinaciones Permutaciones permutaciones l es la lista de las permutaciones de la lista l. Por ejemplo, Main> permutaciones [2,3] [[2,3],[3,2]] Main> permutaciones [1,2,3] [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] Definición recursiva: permutaciones :: Eq a => [a] -> [[a]] permutaciones [] = [[]] permutaciones xs = [a:p | a <- xs, p <- permutaciones(xs [a])] xs ys es la lista de los elementos de xs que no pertenecen a ys. Para usarla, hay que importarla: import Data.List (()) 9 / 30
  • 10. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias Permutaciones y combinaciones Permutaciones Definición alternativa: permutaciones' :: [a] -> [[a]] permutaciones' [] = [[]] permutaciones' (x:xs) = [zs | ys <- permutaciones' xs, zs <- intercala x ys] donde intercala x l es la lista de las listas obtenidas intercalando x entre los elementos de la lista l. Por ejemplo, intercala 1 [2,3] [[1,2,3],[2,1,3],[2,3,1]] intercala :: a -> [a] -> [[a]] intercala e [] = [[e]] intercala e (x:xs) = (e:x:xs) : [(x:ys) | ys <- (intercala e xs)] 10 / 30
  • 11. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias Permutaciones y combinaciones Permutaciones La segunda definición es más eficiente. En efecto, Main> :set +s Main> permutaciones [1,2,3] [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] (429 reductions, 812 cells) Main> permutaciones' [1,2,3] [[1,2,3],[2,1,3],[2,3,1],[1,3,2],[3,1,2],[3,2,1]] (267 reductions, 485 cells) 11 / 30
  • 12. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias Permutaciones y combinaciones Combinaciones combinaciones n l es la lista de las combinaciones n–arias de la lista l. Por ejemplo, combinaciones 2 [1,2,3,4] [[1,2],[1,3],[1,4],[2,3],[2,4 Definición mediante sublistas: combinaciones :: Int -> [a] -> [[a]] combinaciones n xs = [ys | ys <- sublistas xs, length ys == n] 12 / 30
  • 13. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias Permutaciones y combinaciones Combinaciones Definición directa: combinaciones' :: Int -> [a] -> [[a]] combinaciones' 0 _ = [[]] combinaciones' _ [] = [] combinaciones' (n+1) (x:xs) = [x:ys | ys <- combinaciones' n xs] ++ combinaciones' (n+1) xs Comparación de eficiencia: Main> combinaciones 1 [1..10] [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]] (42363 reductions, 52805 cells) Main> combinaciones' 1 [1..10] [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]] (775 reductions, 1143 cells) 13 / 30
  • 14. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias El patrón alias @ Tema 4: Aplicaciones de programación funcional 1. Funciones combinatorias Segmentos y sublistas Permutaciones y combinaciones El patrón alias @ 2. Rompecabezas lógicos 3. Búsqueda en grafos 14 / 30
  • 15. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias El patrón alias @ El patrón alias @ Definición de finales con patrones: finales_1 [] = [[]] finales_1 (x:xs) = (x:xs) : finales_1 xs Definición de finales con selectores: finales_2 [] = [[]] finales_2 xs = xs : finales_2 (tail xs) Definición de finales con alias:: finales_3 [] = [[]] finales_3 l@(x:xs) = l : finales_3 xs El patrón l@(x:xs) se lee “l como x:xs”. 15 / 30
  • 16. PD Tema 4: Aplicaciones de programación funcional Funciones combinatorias El patrón alias @ Definición con alias dropWhile p l es la lista l sin los elementos iniciales que verifican el predicado p. Por ejemplo, dropWhile even [2,4,6,7,8,9] [7,8,9] Prelude dropWhile :: (a -> Bool) -> [a] -> [a] dropWhile p [] = [] dropWhile p ys@(x:xs) | p x = dropWhile p xs | otherwise = ys 16 / 30
  • 17. PD Tema 4: Aplicaciones de programación funcional Rompecabezas lógicos El problema de las reinas Tema 4: Aplicaciones de programación funcional 1. Funciones combinatorias 2. Rompecabezas lógicos El problema de las reinas Números de Hamming 3. Búsqueda en grafos 17 / 30
  • 18. PD Tema 4: Aplicaciones de programación funcional Rompecabezas lógicos 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] 18 / 30
  • 19. PD Tema 4: Aplicaciones de programación funcional Rompecabezas lógicos 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] 19 / 30
  • 20. PD Tema 4: Aplicaciones de programación funcional Rompecabezas lógicos 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) Esta solución está basada en [?] p. 95. 20 / 30
  • 21. PD Tema 4: Aplicaciones de programación funcional Rompecabezas lógicos Números de Hamming Tema 4: Aplicaciones de programación funcional 1. Funciones combinatorias 2. Rompecabezas lógicos El problema de las reinas Números de Hamming 3. Búsqueda en grafos 21 / 30
  • 22. PD Tema 4: Aplicaciones de programación funcional Rompecabezas lógicos 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] 22 / 30
  • 23. PD Tema 4: Aplicaciones de programación funcional Rompecabezas lógicos 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) 23 / 30
  • 24. PD Tema 4: Aplicaciones de programación funcional Rompecabezas lógicos 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 24 / 30
  • 25. PD Tema 4: Aplicaciones de programación funcional Búsqueda en grafos Búsqueda en profundidad grafos Tema 4: Aplicaciones de programación funcional 1. Funciones combinatorias 2. Rompecabezas lógicos 3. Búsqueda en grafos Búsqueda en profundidad grafos 25 / 30
  • 26. PD Tema 4: Aplicaciones de programación funcional Búsqueda en grafos Búsqueda en profundidad grafos Representación de grafos Un grafo de tipo v es un tipo de datos compuesto por la lista de vértices y la función que asigna a cada vértice la lista de sus sucesores. data Grafo v = G [v] (v -> [v]) 26 / 30
  • 27. PD Tema 4: Aplicaciones de programación funcional Búsqueda en grafos Búsqueda en profundidad grafos Representación de grafos ej_grafo es la representación del grafo ej_grafo = G [1..5] suc where suc 1 = [2,3] suc 2 = [4] suc 3 = [4] suc _ = [] 27 / 30
  • 28. PD Tema 4: Aplicaciones de programación funcional Búsqueda en grafos Búsqueda en profundidad grafos Búsqueda de los caminos en un grafo caminosDesde g o te vis es la lista de los caminos en el grafo g desde el vértice origen o hasta vértices finales (i.e los que verifican el test de encontrado te) sin volver a pasar por los vértices visitados vis. Por ejemplo, caminosDesde ej_grafo 1 (==4) [] [[4,2,1],[4,3,1]] caminosDesde :: Eq a => Grafo a -> a -> (a -> Bool) -> [a] caminosDesde g o te vis | te o = [o:vis] | otherwise = concat [caminosDesde g o' te (o:vis) | o' <- suc o, notElem o' vis] where G _ suc = g 28 / 30
  • 29. PD Tema 4: Aplicaciones de programación funcional Búsqueda en grafos Búsqueda en profundidad grafos Búsqueda de un camino en un grafo camino g u v es un camino (i.e una lista de vértices tales que cada uno es un sucesor del anterior) en el grafo g desde el vértice u al v. Por ejemplo, camino ej_grafo 1 4 [4,2,1] camino :: Eq a => Grafo a -> a -> a -> [a] camino g u v = head (caminosDesde g u (== v) []) 29 / 30
  • 30. PD Tema 4: Aplicaciones de programación funcional Búsqueda en grafos Búsqueda en profundidad grafos Bibliografía 1. H. C. Cunningham (2007) Notes on Functional Programming with Haskell. 2. J. Fokker (1996) Programación funcional. 3. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J. Gallardo (2004). Razonando con Haskell (Un curso sobre programación funcional). 4. S. Thompson (1999) Haskell: The Craft of Functional Programming. 5. E.P. Wentworth (1994) Introduction to Funcional Programming. 30 / 30