
-- Il seguente codice non e' commentato. Commentarlo.

mygraph = [(1,2),(1,4),(1,3),(2,3),(2,5),(3,4),(3,5),(4,5)]


type Node = Integer 

type Arc = (Node,Node)

type Graph =[Arc]

type Path = [Node]

type Visited = [Node]

data Set a = Set [a]


connected :: Node -> Node -> Graph -> Bool

connected n1 n2 g  = not (null [(x,y) | (x,y) <- g, (n1==x && n2==y) || (n2==y && n1==x)])


connectedNodes :: Node -> Graph -> Visited -> [Node]

connectedNodes nA g visited = [ x | (x,y) <- g,  (nA == y), not(isin x visited) ]++[ y | (x,y) <- g, (nA == x), not(isin y visited)]



isin :: Node -> Visited -> Bool

isin n [] = False
isin n (v:vs) = (n==v)||(isin n vs)



join :: Node -> [Path] -> [Path]

join n []     = []
join n (p:ps) = (n:p):(join n ps)



multi_travel :: Graph -> [Node] -> Node -> Visited -> [Path]

multi_travel g [] _ _ = []

multi_travel g (nd:nds) n2 visited 
       |  nd==n2    = [[n2]]++subpaths
       |  otherwise = (join nd (multi_travel g connList n2 (nd:visited)))++subpaths
      where connList = connectedNodes nd g visited 
            subpaths   = (multi_travel g nds n2 visited)
             


paths :: Graph -> Node -> Node -> [Path]


paths g n1 n2 = multi_travel g [n1] n2 []
