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