module WWL

where 
import List
import Char

divides :: Integer -> Integer -> Bool
divides m n = rem n m == 0

sqr :: Int -> Int 
sqr = \ x -> x * x 

threefold :: Int -> Bool
threefold = \ x -> rem x 3 == 0

aword :: [Char] -> Bool
aword [] = False 
aword (x:xs) = (x == 'a') || (aword xs)

mnmInt :: [Int] -> Int
mnmInt [] = error "empty list" 
mnmInt [x] = x
mnmInt (x:xs) = min x (mnmInt xs)

containedIn :: Eq a => [a] -> [a] -> Bool
containedIn xs ys = all (\ x -> elem x ys) xs

sameSet :: Eq a => [a] -> [a] -> Bool
sameSet xs ys = 
  containedIn xs ys && containedIn ys xs

type Rel a = [(a,a)]

r1 = [(1,2),(2,1)]

r2 = [(1,2),(2,1),(2,1)]

sameR :: Ord a => Rel a -> Rel a -> Bool
sameR r s = sort (nub r) == sort (nub s)

sameR' :: Eq a => Rel a -> Rel a -> Bool
sameR' r s = sameSet r s 

cnv :: Rel a -> Rel a
cnv r = [ (y,x) | (x,y) <- r ]

infixr 5 @@

(@@) :: Eq a => Rel a -> Rel a -> Rel a
r @@ s = 
  nub [ (x,z) | (x,y) <- r, (w,z) <- s, y == w ]


