--Il seguente codice e' privo di commenti. Commentarlo. mygraph = [(1,2),(1,4),(1,3),(2,3),(2,5),(3,4),(3,5),(4,5)] removeduplicates [] = [] removeduplicates (x:xs) = x:[ y | y<-(removeduplicates xs), not(x == y)] type Node = Integer type Arc = (Node,Node) type Graph =[Arc] type Path = [Node] connected :: Node -> Node -> Graph -> Bool connected n1 n2 g = not (null [(x,y) | (x,y) <- g, (n1==x && n2==y) || (n1==y && n2==x)]) connectedNodes :: Node -> Graph -> [Node] connectedNodes nA g = removeduplicates [ x | (x,y) <- g, (nA == y) ]++[ y | (x,y) <- g, (nA == x)] minusNode :: Graph -> Node -> Graph minusNode g n = [(x,y) | (x,y)<-g, not(x==n), not(y==n) ] complete :: Graph -> Graph complete [] = [] complete g = removeduplicates g++[(x,x) | (x,y)<- g]++[(y,y) | (x,y)<-g] join :: Node -> [Path] -> [Path] join n [] = [] join n (p:ps) = (n:p):(join n ps) pathsC :: Graph -> Node -> Node -> [Path] pathsC [] nA nB = [] pathsC g nA nB | nA == nB = [[nA]] | otherwise = join nA subpaths where connList = connectedNodes nA g subpaths = (multi_paths (minusNode g nA) connList nB) multi_paths :: Graph -> [Node] -> Node -> [Path] multi_paths g [] nB = [] multi_paths g (n:ns) nB = (pathsC g n nB)++(multi_paths g ns nB) paths :: Graph -> Node -> Node -> [Path] paths g nA nB = pathsC (complete g) nA nB