// Mart Lubbers s4109503, Camil Staps s4498062 implementation module StdDynSet import StdEnv import StdMaybe import StdDynamic isEqual:: Dynamic t -> Bool | Set t isEqual (x :: t^) a = x == a isEqual _ _ = False class Set a | TC, ==, toString a :: Set = Set [(Dynamic, Dynamic -> Bool, String)] instance zero Set where zero = Set [] instance toString Set where toString (Set [(_,_,a):as]) = "{" +++ a +++ (foldl (+++) "" ["," +++ s \\ (_,_,s) <- as]) +++ "}" instance == Set where == a b = nrOfElts a == nrOfElts b && isSubset a b toSet :: a -> Set | Set a toSet e = Set [(dynamic e, \x = isEqual x e, toString e)] nrOfElts :: Set -> Int nrOfElts (Set a) = length a isEmptySet :: Set -> Bool isEmptySet a = (nrOfElts a) == 0 memberOfSet :: a Set -> Bool | Set a memberOfSet _ (Set []) = False memberOfSet x (Set [(y,_,_):ys]) = isEqual y x || memberOfSet x (Set ys) dynMemberOfSet :: Dynamic Set -> Bool dynMemberOfSet _ (Set []) = False dynMemberOfSet x (Set [(_,eq,_):ys]) = eq x || dynMemberOfSet x (Set ys) isSubset :: Set Set -> Bool isSubset a b = (nrOfElts a) == (nrOfElts (intersection a b)) isStrictSubset :: Set Set -> Bool isStrictSubset a b = isSubset a b && nrOfElts a < nrOfElts b union :: Set Set -> Set union (Set a) (Set b) = Set (a ++ (fromSet (without (Set b) (Set a)))) where fromSet :: Set -> [(Dynamic, Dynamic -> Bool, String)] fromSet (Set x) = x intersection :: Set Set -> Set intersection as (Set []) = as intersection (Set as) (Set bs) = Set [(a,eq,ts) \\ (a,eq,ts) <- as | dynMemberOfSet a (Set bs)] without :: Set Set -> Set without (Set as) (Set bs) = Set [(a,eq,ts) \\ (a,eq,ts) <- as | not (dynMemberOfSet a (Set bs))] Start = toString (union (toSet 1) (toSet 2))