30 lines
990 B
Haskell
30 lines
990 B
Haskell
|
import Control.Monad (mapM_)
|
||
|
import Data.List (nub)
|
||
|
|
||
|
type Pair = (Integer, Integer)
|
||
|
type Relation = (Pair, Pair)
|
||
|
|
||
|
cartesianProduct :: [Integer] -> [Pair]
|
||
|
cartesianProduct domain = [ (x,y) | x <- domain,
|
||
|
y <- domain ]
|
||
|
|
||
|
calculateRelations :: [Pair] -> (Pair -> Pair -> Bool) -> [Relation]
|
||
|
calculateRelations set relation
|
||
|
= nub [ (p1, p2) | p1 <- set,
|
||
|
p2 <- set,
|
||
|
relation p1 p2 ]
|
||
|
|
||
|
getRelatedPairsOf :: Pair -> [Relation] -> [Pair]
|
||
|
getRelatedPairsOf s r = [ p2 | (p1, p2) <- r,
|
||
|
p1 == s ]
|
||
|
|
||
|
main :: IO ()
|
||
|
main = do
|
||
|
let
|
||
|
-- set a be the cartesian product of two lists of integers from 1 to and including 5
|
||
|
setA = cartesianProduct [1..5]
|
||
|
-- set r be the relation on a that satisfy the following condition
|
||
|
r = calculateRelations setA (\(x,y) (u,v) -> x+y == u+v)
|
||
|
|
||
|
-- filter out the equivalence classes of the following pairs
|
||
|
mapM_ (print . flip getRelatedPairsOf r) [(1,3), (2,4), (1,1)]
|