summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assignment-10/sets.icl106
1 files changed, 55 insertions, 51 deletions
diff --git a/assignment-10/sets.icl b/assignment-10/sets.icl
index de4a62a..ecdcad6 100644
--- a/assignment-10/sets.icl
+++ b/assignment-10/sets.icl
@@ -32,49 +32,51 @@ hasElem :: (a [a] -> Bool) | Eq a
hasElem = isMember
:: Expression a
- = New (Bimap a [Int]) [Int]
- | Elem (Bimap a Int) Int
- | E.b: Variable (Bimap a b) Ident
- | Size (Bimap a Int) Set
- | (+.) infixl 6 (Expression a) (Expression a) & + a
- | AddElemAndSet (Bimap a [Int]) Elem Set
- | AddSetAndElem (Bimap a [Int]) Set Elem
- | (-.) infixl 6 (Expression a) (Expression a) & - a
- | RemoveFromSet (Bimap a [Int]) Set Elem
- | (*.) infixl 7 (Expression a) (Expression a) & * a
- | MulElemAndSet (Bimap a [Int]) Elem Set
- | (=.) infixl 2 Ident (Expression a)
-
- | Logical (Bimap a Bool) Bool
- | Not (Bimap a Bool) Logical
- | Or (Bimap a Bool) Logical Logical
- | And (Bimap a Bool) Logical Logical
- | In (Bimap a Bool) Elem Set
- | E.b: Eq (Bimap a Bool) (Expression b) (Expression b) & TC, == b
- | E.b: Le (Bimap a Bool) (Expression b) (Expression b) & TC, Ord b
-
- | If Logical (Expression a) (Expression a)
- | For (Bimap a [Int]) Ident Set (Expression Int)
- | E.b: (:.) infixl 1 (Expression b) (Expression a) & TC b
+ = E.b: New (Bimap a [b]) [b]
+ | Elem a
+ | Variable Ident
+ | E.b: Size (Bimap a Int) (Set b) & TC b
+ | (+.) infixl 6 (Expression a) (Expression a) & + a
+ | E.b: AddElemAndSet (Bimap a [b]) (Elem b) (Set b) & TC, Eq b
+ | E.b: AddSetAndElem (Bimap a [b]) (Set b) (Elem b) & TC, Eq b
+ | (-.) infixl 6 (Expression a) (Expression a) & - a
+ | E.b: RemoveFromSet (Bimap a [b]) (Set b) (Elem b) & TC, Eq b
+ | (*.) infixl 7 (Expression a) (Expression a) & * a
+ | E.b: MulElemAndSet (Bimap a [b]) (Elem b) (Set b) & TC, * b
+ | (=.) infixl 2 Ident (Expression a)
+
+ | Not (Bimap a Bool) (Elem Bool)
+ | Or (Bimap a Bool) (Elem Bool) (Elem Bool)
+ | And (Bimap a Bool) (Elem Bool) (Elem Bool)
+ | E.b: In (Bimap a Bool) (Elem b) (Set b) & TC, Eq b
+ | E.b: Eq (Bimap a Bool) (Expression b) (Expression b) & TC, Eq b
+ | E.b: Le (Bimap a Bool) (Expression b) (Expression b) & TC, Ord b
+
+ | If (Elem Bool) (Expression a) (Expression a)
+ | E.b c: For (Bimap a [b]) Ident (Set c) (Expression b) & TC b & TC c
+ | E.b: (:.) infixl 1 (Expression b) (Expression a) & TC b
// Convenience
new :== New bimapId
-elem :== Elem bimapId
-var :== Variable bimapId
+elem :== Elem
+var :== Variable
size :== Size bimapId
for :== For bimapId
-(+:) infixl 6; (+:) :== AddSetAndElem bimapId
-(:+) infixl 6; (:+) :== AddElemAndSet bimapId
-(-:) infixl 6; (-:) :== RemoveFromSet bimapId
-(:*) infixl 7; (:*) :== MulElemAndSet bimapId
+(+:) infixl 6; (+:) :== AddSetAndElem bimapId
+(:+) infixl 6; (:+) :== AddElemAndSet bimapId
+(-:) infixl 6; (-:) :== RemoveFromSet bimapId
+(:*) infixl 7; (:*) :== MulElemAndSet bimapId
+(==.) infix 4; (==.) :== Eq bimapId
+(<=.) infix 4; (<=.) :== Le bimapId
+(||.) infixr 2; (||.) :== Or bimapId
+(&&.) infixr 3; (&&.) :== And bimapId
:: SetState :== 'M'.Map Ident Dynamic
:: Sem a :== StateT SetState (MaybeError String) a
-:: Set :== Expression [Int]
-:: Elem :== Expression Int
-:: Logical :== Expression Bool
+:: Set a :== Expression [a]
+:: Elem a :== Expression a
:: Ident :== String
fail :: (String -> StateT s (MaybeError String) a)
@@ -90,28 +92,30 @@ read i = gets ('M'.get i) >>= \v -> case v of
Nothing -> fail $ "unknown variable '" <+ i <+ "'"
eval :: (Expression a) -> Sem a | TC a
-eval (New bm xs) = pure $ bm.map_from xs
-eval (Elem bm x) = pure $ bm.map_from x
-eval (Variable bm id) = read id
-eval (Size bm s) = bm.map_from <$> length <$> eval s
-eval (+. x y) = (liftA2 (+) `on` eval) x y
+eval (New bm xs) = pure $ bm.map_from xs
+eval (Elem x) = pure x
+eval (Variable id) = read id
+eval (Size bm s) = bm.map_from <$> length <$> eval s
+eval (+. x y) = (liftA2 (+) `on` eval) x y
eval (AddElemAndSet bm e s) = bm.map_from <$> liftA2 addElem (eval e) (eval s)
eval (AddSetAndElem bm s e) = bm.map_from <$> liftA2 addElem (eval e) (eval s)
-eval (-. x y) = (liftA2 (-) `on` eval) x y
+eval (-. x y) = (liftA2 (-) `on` eval) x y
eval (RemoveFromSet bm s e) = bm.map_from <$> liftA2 removeElem (eval e) (eval s)
-eval (*. x y) = (liftA2 (*) `on` eval) x y
+eval (*. x y) = (liftA2 (*) `on` eval) x y
eval (MulElemAndSet bm e s) = bm.map_from <$> liftA2 (map o (*)) (eval e) (eval s)
-eval (=. id e) = eval e >>= store id
-eval (Logical bm b) = pure $ bm.map_from b
-eval (Not bm l) = bm.map_from <$> not <$> eval l
-eval (Or bm x y) = bm.map_from <$> (liftA2 (||) `on` eval) x y
-eval (And bm x y) = bm.map_from <$> (liftA2 (&&) `on` eval) x y
-eval (In bm e s) = bm.map_from <$> liftA2 hasElem (eval e) (eval s)
-eval (Eq bm x y) = bm.map_from <$> liftA2 (==) (eval x) (eval y)
-eval (Le bm x y) = bm.map_from <$> liftA2 (<=) (eval x) (eval y)
-eval (If b t e) = eval b >>= \b -> eval $ if b t e
-eval (For bm id s e) = bm.map_from <$> (eval s >>= mapM (\x -> store id x >>| eval e))
-eval (s :. t) = eval s >>| eval t
+eval (=. id e) = eval e >>= store id
+eval (Not bm l) = bm.map_from <$> not <$> eval l
+eval (Or bm x y) = bm.map_from <$> (liftA2 (||) `on` eval) x y
+eval (And bm x y) = bm.map_from <$> (liftA2 (&&) `on` eval) x y
+eval (In bm e s) = bm.map_from <$> liftA2 hasElem (eval e) (eval s)
+eval (Eq bm x y) = bm.map_from <$> liftA2 (==) (eval x) (eval y)
+eval (Le bm x y) = bm.map_from <$> liftA2 (<=) (eval x) (eval y)
+eval (If b t e) = eval b >>= \b -> eval $ if b t e
+eval (For bm id s e) = bm.map_from <$> (eval s >>= iterate e)
+where
+ iterate :: (Elem b) -> [a] -> Sem [b] | TC a & TC b
+ iterate e = mapM (\x -> store id x >>| eval e)
+eval (s :. t) = eval s >>| eval t
/**
* I did not manage to get the iTasks simulator working, because the compiler