Vous êtes sur la page 1sur 13

Grafos

Lic. Wilber Ramos Lovn

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.

Representacin de grafos conociendo los sucesores:


data Grafo a = G [a] (a->[a]) vrtices funciones que representa aristas

g :: Grafo Int g = G[1,2,3,4,5,6] suc Where


suc 1 = [2,3] suc 2 = [4] suc 3 = [4] suc _ = []

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

La condicin que debe cumplir es lo que se llama test de localizacin (o poda).

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 _ = [ ]

Vous aimerez peut-être aussi