-- 同値類のリストを算出 classify :: Eq a => (a, a) -> [[a]] -> [[a]] classify (x, y) [] = [[x, y]] classify (x, y) (c : cs) | x `elem` c = (y : c) : cs | y `elem` c = (x : c) : cs | otherwise = c : classify (x, y) cs
inEqvCl :: Eq a => (a, a) -> [(a, a)] -> Bool inEqvCl (x, y) lis = (not . null) (filter (f x y) (foldr classify [] lis)) where f x y c = x `elem` c && y `elem` c