module Exercise_7 where import Data.List import Data.Maybe {-WETT-} trancl :: Eq a => [(Integer,(a,a))] -> [(Integer,(a,a))] trancl rel = if eqRel recStep curStep then curStep else trancl curStep where tranclCalc rel = filter (\(d, (a,b)) -> not (lessThan d (a,b) trans)) trans where trans = nub ([((d+e), (a,c)) | (d, (a,b)) <- rel, (e, (b',c)) <- rel, b == b'] ++ rel) lessThan d (a,b) [] = False lessThan d (a,b) ((e, (a',b')):rels) | a == a' && b == b' && e < d = True | otherwise = lessThan d (a,b) rels curStep = tranclCalc rel recStep = tranclCalc curStep eqRel recStep curStep = length recStep == length curStep && and [x `elem` curStep | x <- recStep] {-TTEW-}