Académique Documents
Professionnel Documents
Culture Documents
Grafos en Haskell
Tenemos al igual que en los arrays la posibilidad de representar grafos en Haskell de dos formas: Representacin de grafos conociendo los sucesores. Representacin de un grafo como una instancia de una clase.
El ejemplo que a continuacin se propone calcula el sucesor de un nodo en el grafo propuesto anteriormente:
sucesor :: Int-> (Grafo Int) -> [Int] sucesor x (G(h:hs) suc) | x == h = suc x | otherwise = sucesor x (G hs suc)
Podemos tambin crear grafos en los cuales introducir un valor (peso ) a cada arista.
data GrafoP a p = GP [a] (a->[(a,p)])
Tipo de los vrtices Peso de aristas entre cada nodo
De esta forma quedan totalmente definidos tanto los vrtices, los sucesores y los pesos de las aristas .
Representacin en Haskell:
gp :: GrafoP Int Int gp = GP [1,2,3,4,5] suc where
suc 1 = [(2,5),(3,8)] suc 2 = [(4,2)] suc 3 = [(4,1)] suc _ = []
Haskell da la posibilidad de representacin de grafos utilizando las clases. Definiremos una clase con dos funciones esenciales: vrtices y sucesor.
class (Eq a) => Grafo a where vertices :: [a]; devuelve los vrtices de un grafo. sucesor :: a -> [a]; devuelve los vrtices
sucesores
La representacin anteriormente expuesta: class (Eq a) => Grafo a La interpretacin que se le da es que el tipo de Grafo definido como a tiene que ser el mismo que el definido en Eq para que se puedan comparar los elementos. Tambin podramos interpretar la definicin de Grafo como una subclase de Eq.
A continuacin definiremos una serie de mtodos para resolver problemas de bsquedas de caminos.
(</-) :: (Eq a)=> a->[a]->Bool camino :: a->[a] ->[a] camino_desde:: a->(a->Bool)->[a]->[[a]]
(</-) indica la pertenencia de un
elemento, camino nos devuelve una lista con los vrtices que forman un camino entre dos vrtices dados
camino_desde:: a->(a->Bool)->[a]->[[a]]
vrtice origen condicin que debe cumplir el final
salida
camino_desde o te vis | te o = [o : vis]--satisface el test el vrtice origen? | otherwise = concat [ camino_desde o' te (o : vis) | o' <- suc o, o'</- vis ] Siendo: o: vrtice origen. te: test de localizacin. vis: lista de vrtices ya visitados (inicialmente [ ]).
La funcin camino_desde devuelve la lista de todos los caminos partiendo desde un vrtice hasta satisfacer el test de localizacin. La funcin camino podemos definirla en funcin de camino_desde como sigue: camino u v = head (camino_desde u (== v) [ ]) Como podemos observar, selecciona el primer camino de todos los que cumplen el test de localizacin para el vrtice indicado.
Como se creara un grafo con esta forma de representacin: data G1 = Uno | Dos | Tres | Cuatro | Cinco deriving (Eq, Enum) instance Grafo G1 where vertices = [Uno .. Cinco] -- Permitido al derivar G1 de Enum suc Uno = [Dos ,Tres] suc Dos = [Cuatro] suc Tres = [Cuatro] suc _ = [ ]