module Exercise_7 where {-WETT-} comp :: Eq b => [(Integer,(a,b))] -> [(Integer,(b,c))] -> [(Integer,(a,c))] comp r s = [ (i1 + i2, (x,z))| (i1,(x,y1)) <- r, (i2, (y2,z)) <- s, y1 == y2] remove_duplicates :: Eq a => [(Integer,(a,a))] -> [(Integer,(a,a))] -> [(Integer,(a,a))] remove_duplicates [] acc = acc remove_duplicates (r:rs) acc = let (_, (a,b)) = r min_r = minimum [k | (k, (c,d)) <-(r:rs), c == a, d == b] rest = [(k, (c,d)) | (k, (c,d)) <-(r:rs), c /= a || d /= b] in remove_duplicates rest (acc ++ [(min_r, (a,b))]) trancl :: Eq a => [(Integer,(a,a))] -> [(Integer,(a,a))] trancl r = find_transitives r find_transitives rs = let oneSteps = remove_duplicates (rs ++ (comp rs rs)) [] in if relEq oneSteps rs then rs else find_transitives oneSteps relEq :: Eq a => [(Integer,(a,a))] -> [(Integer,(a,a))] -> Bool relEq [] [] = True relEq _ [] = False relEq [] _ = False relEq (x:xs) rs = x `elem` rs && (relEq xs [r | r <- rs, r /= x]) {-TTEW-}