diff options
author | Péter Diviánszky <divipp@gmail.com> | 2016-05-16 09:36:57 +0200 |
---|---|---|
committer | Péter Diviánszky <divipp@gmail.com> | 2016-05-16 09:36:57 +0200 |
commit | 1df9d442261cd7ad9b889ca48b23ee34cf6121e9 (patch) | |
tree | 6c038e898ae355a3c28f69f2c4423277ee28cd1f | |
parent | 629f80cfeedd133f0ccca596dc33a4b54d2369eb (diff) |
compactify db indices
-rw-r--r-- | prototypes/LamMachine.hs | 199 |
1 files changed, 110 insertions, 89 deletions
diff --git a/prototypes/LamMachine.hs b/prototypes/LamMachine.hs index b98f84e3..59342a58 100644 --- a/prototypes/LamMachine.hs +++ b/prototypes/LamMachine.hs | |||
@@ -23,16 +23,18 @@ import LambdaCube.Compiler.DeBruijn hiding (up) | |||
23 | 23 | ||
24 | -- expression | 24 | -- expression |
25 | data Exp_ | 25 | data Exp_ |
26 | = Lam_ Exp | 26 | = Var_ Int |
27 | | Var_ Int | 27 | | Y_ Exp |
28 | | Int_ Int | ||
29 | | Lam_ Exp | ||
30 | |||
28 | | App_ Exp Exp | 31 | | App_ Exp Exp |
29 | | Seq_ Exp Exp | 32 | | Seq_ Exp Exp |
30 | | Con_ String Int [Exp] | 33 | | Con_ String Int [Exp] |
31 | | Case_ Exp [(String, Exp)] | 34 | | Case_ Exp [(String, Exp)] |
32 | | Int_ Int | ||
33 | | Op1_ Op1 Exp | 35 | | Op1_ Op1 Exp |
34 | | Op2_ Op2 Exp Exp | 36 | | Op2_ Op2 Exp Exp |
35 | | Y_ Exp | 37 | |
36 | | Ups_ [Up] Exp | 38 | | Ups_ [Up] Exp |
37 | -- deriving (Eq) | 39 | -- deriving (Eq) |
38 | 40 | ||
@@ -43,7 +45,14 @@ data Op2 = Add | Sub | Mod | LessEq | EqInt | |||
43 | deriving (Eq, Show) | 45 | deriving (Eq, Show) |
44 | 46 | ||
45 | -- cached free variables set | 47 | -- cached free variables set |
46 | data Exp = Exp FreeVars Exp_ | 48 | data Exp = Exp' FreeVars Exp_ |
49 | |||
50 | pattern Exp a b <- Exp' a b | ||
51 | where Exp a b = compact a b | ||
52 | |||
53 | compact a b@Ups_{} = Exp' a b | ||
54 | compact a b | a == FreeVars (2^maxFreeVar a - 1) = Exp' a b | ||
55 | | otherwise = tracePShow (a, Exp' undefined b) $ Exp' a b | ||
47 | 56 | ||
48 | -- state of the machine | 57 | -- state of the machine |
49 | data MSt = MSt [(FreeVars, Exp)] -- TODO: use finger tree instead of list | 58 | data MSt = MSt [(FreeVars, Exp)] -- TODO: use finger tree instead of list |
@@ -53,20 +62,20 @@ data MSt = MSt [(FreeVars, Exp)] -- TODO: use finger tree instead of list | |||
53 | --------------------------------------------------------------------- toolbox: pretty print | 62 | --------------------------------------------------------------------- toolbox: pretty print |
54 | 63 | ||
55 | instance PShow Exp where | 64 | instance PShow Exp where |
56 | pShow x = case {-pushUps-} x of | 65 | pShow x = case pushUps x of |
57 | Var i -> DVar i | 66 | Var_ i -> DVar i |
58 | App a b -> DApp (pShow a) (pShow b) | 67 | App_ a b -> DApp (pShow a) (pShow b) |
59 | Seq a b -> DOp "`seq`" (Infix 1) (pShow a) (pShow b) | 68 | Seq_ a b -> DOp "`seq`" (Infix 1) (pShow a) (pShow b) |
60 | Lam e -> shLam_ True $ pShow e | 69 | Lam_ e -> shLam_ True $ pShow e |
61 | Con s i xs -> foldl DApp (text s) $ pShow <$> xs | 70 | Con_ s i xs -> foldl DApp (text s) $ pShow <$> xs |
62 | Int i -> pShow i | 71 | Int_ i -> pShow i |
63 | Op1 o x -> text (show o) `DApp` pShow x | 72 | Op1_ o x -> text (show o) `DApp` pShow x |
64 | Op2 EqInt x y -> DOp "==" (Infix 4) (pShow x) (pShow y) | 73 | Op2_ EqInt x y -> DOp "==" (Infix 4) (pShow x) (pShow y) |
65 | Op2 Add x y -> DOp "+" (InfixL 6) (pShow x) (pShow y) | 74 | Op2_ Add x y -> DOp "+" (InfixL 6) (pShow x) (pShow y) |
66 | Op2 o x y -> text (show o) `DApp` pShow x `DApp` pShow y | 75 | Op2_ o x y -> text (show o) `DApp` pShow x `DApp` pShow y |
67 | Y e -> "Y" `DApp` pShow e | 76 | Y_ e -> "Y" `DApp` pShow e |
68 | Case e xs -> DPreOp (-20) (ComplexAtom "case" (-10) (pShow e) (SimpleAtom "of")) $ foldr1 DSemi [DArr_ "->" (text a) (pShow b) | (a, b) <- xs] | 77 | Case_ e xs -> DPreOp (-20) (ComplexAtom "case" (-10) (pShow e) (SimpleAtom "of")) $ foldr1 DSemi [DArr_ "->" (text a) (pShow b) | (a, b) <- xs] |
69 | Ups u xs -> DPreOp (-20) (SimpleAtom $ show u) $ pShow xs | 78 | Ups_ u xs -> DPreOp (-20) (SimpleAtom $ show u) $ pShow xs |
70 | 79 | ||
71 | shLam_ usedVar b = DFreshName usedVar $ showLam (DVar 0) b | 80 | shLam_ usedVar b = DFreshName usedVar $ showLam (DVar 0) b |
72 | 81 | ||
@@ -94,34 +103,37 @@ instance PShow MSt where | |||
94 | instance HasFreeVars Exp where | 103 | instance HasFreeVars Exp where |
95 | getFreeVars (Exp fv _) = fv | 104 | getFreeVars (Exp fv _) = fv |
96 | 105 | ||
97 | upss [] e = e | 106 | upss [] (getUs -> (_, e)) = e |
98 | upss u e = Ups u e | 107 | upss u (getUs -> (_, e)) = Ups u e |
108 | |||
109 | upss_ [] (Exp _ e) = e | ||
110 | upss_ u e = Ups_ u e | ||
99 | 111 | ||
100 | dup2 f (Ups a ax) (Ups b bx) = Ups_ s $ Exp (getFreeVars az <> getFreeVars bz) $ f az bz where | 112 | dup2 f ax bx = upss_ s $ Exp (getFreeVars az <> getFreeVars bz) $ f az bz where |
101 | (s, [a', b']) = deltaUps [a, b] | 113 | (s, [a', b']) = deltaUps [ax, bx] |
102 | az = upss a' ax | 114 | az = upss a' ax |
103 | bz = upss b' bx | 115 | bz = upss b' bx |
104 | dup2 f a b = f a b | 116 | |
105 | dup1 f (Ups a ax) = Ups_ a $ Exp (getFreeVars ax) $ f ax | 117 | dup1 f (Ups a ax) = upss_ a $ Exp (getFreeVars ax) $ f ax |
106 | dup1 f x = f x | 118 | dup1 f x = f x |
107 | 119 | ||
108 | getUs (Ups x y) = (x, y) | 120 | getUs (Ups x y) = (x, y) |
109 | getUs y = ([], y) | 121 | getUs y = ([], y) |
110 | 122 | ||
111 | dupCon f [] = f [] | 123 | dupCon f [] = f [] |
112 | dupCon f [Ups a ax] = Ups_ a $ Exp (getFreeVars ax) $ f [ax] | 124 | --dupCon f [Ups a ax] = Ups_ a $ Exp (getFreeVars ax) $ f [ax] |
113 | dupCon f (unzip . map getUs -> (b, bx)) = Ups_ s $ Exp (foldMap getFreeVars bz) $ f bz where | 125 | dupCon f bx = upss_ s $ Exp (foldMap getFreeVars bz) $ f bz where |
114 | (s, b') = deltaUps b | 126 | (s, b') = deltaUps bx |
115 | bz = zipWith upss b' bx | 127 | bz = zipWith upss b' bx |
116 | 128 | ||
117 | dupCase f (getUs -> (a, ax)) (unzip -> (ss, unzip . map getUs -> (b, bx))) | 129 | dupCase f ax (unzip -> (ss, bx)) |
118 | = Ups_ s $ Exp (getFreeVars az <> foldMap getFreeVars bz) $ f az $ zip ss bz | 130 | = upss_ s $ Exp (getFreeVars az <> foldMap getFreeVars bz) $ f az $ zip ss bz |
119 | where | 131 | where |
120 | (s, a': b') = deltaUps $ a: b | 132 | (s, a': b') = deltaUps $ ax: bx |
121 | az = upss a' ax | 133 | az = upss a' ax |
122 | bz = zipWith upss b' bx | 134 | bz = zipWith upss b' bx |
123 | 135 | ||
124 | dupLam f (Ups a ax) = Ups_ (ff a) $ Exp (shiftFreeVars (-1) $ getFreeVars ax') $ f ax' | 136 | dupLam f (Ups a ax) = upss_ (ff a) $ Exp (shiftFreeVars (-1) $ getFreeVars ax') $ f ax' |
125 | where | 137 | where |
126 | ax' = case a of | 138 | ax' = case a of |
127 | Up 0 n: _ -> up (Up 0 1) ax | 139 | Up 0 n: _ -> up (Up 0 1) ax |
@@ -164,20 +176,14 @@ rearr (Up l n) = rearrangeFreeVars (RFUp n) l | |||
164 | 176 | ||
165 | upsFreeVars xs s = foldr rearr s xs | 177 | upsFreeVars xs s = foldr rearr s xs |
166 | 178 | ||
167 | pushUps (Ups us e) = foldr pushUp e us | 179 | showUps us n = foldr f (replicate n True) us where |
168 | pushUps e = e | 180 | f (Up l n) is = take l is ++ replicate n False ++ drop l is |
169 | |||
170 | showUps us = foldr f [] us where | ||
171 | f (Up l n) is = take n [l..] ++ map (n+) is | ||
172 | 181 | ||
173 | --sectUps' a b = sect (showUps a) (showUps b) -- sectUps 0 a 0 b | 182 | --sectUps' a b = sect (showUps a) (showUps b) -- sectUps 0 a 0 b |
174 | 183 | ||
175 | sect [] _ = [] | 184 | sect [] xs = xs |
176 | sect _ [] = [] | 185 | sect xs [] = xs |
177 | sect (x:xs) (y:ys) | 186 | sect (x:xs) (y:ys) = (x || y): sect xs ys |
178 | | x == y = x: sect xs ys | ||
179 | | x < y = sect xs (y: ys) | ||
180 | | x > y = sect (x: xs) ys | ||
181 | 187 | ||
182 | {- TODO | 188 | {- TODO |
183 | sectUps _ u _ [] = [] | 189 | sectUps _ u _ [] = [] |
@@ -198,32 +204,43 @@ diffUps [] [] = [] | |||
198 | diffUps (Up l n: us) (Up l' n': us') = insertUp (Up l' (l - l')) $ diffUps us (Up (l + n) (l' + n' - l - n): us') | 204 | diffUps (Up l n: us) (Up l' n': us') = insertUp (Up l' (l - l')) $ diffUps us (Up (l + n) (l' + n' - l - n): us') |
199 | -} | 205 | -} |
200 | 206 | ||
201 | diffUps = diffUps' 0 | 207 | diffUps a b = diffUps' 0 (back a) (back b) |
202 | 208 | ||
203 | diffUps' n u [] = (+(-n)) <$> u | 209 | diffUps' n u [] = (+(-n)) <$> u |
210 | diffUps' n [] _ = [] | ||
204 | diffUps' n (x: xs) (y: ys) | 211 | diffUps' n (x: xs) (y: ys) |
205 | | x < y = (x - n): diffUps' n xs (y: ys) | 212 | | x < y = (x - n): diffUps' n xs (y: ys) |
206 | | x == y = diffUps' (n+1) xs ys | 213 | | x == y = diffUps' (n+1) xs ys |
207 | 214 | ||
215 | back = map fst . filter (not . snd) . zip [0..] | ||
216 | |||
208 | mkUps = f 0 | 217 | mkUps = f 0 |
209 | where | 218 | where |
210 | f i [] = [] | 219 | f i [] = [] |
211 | f i (x: xs) = insertUp (Up (x-i) 1) $ f (i+1) xs | 220 | f i (x: xs) = insertUp (Up (x-i) 1) $ f (i+1) xs |
212 | 221 | ||
213 | deltaUps us = (mkUps s, [mkUps $ showUps u `diffUps` s | u <- us]) | 222 | deltaUps = deltaUps_ . map (crk . getUs) |
223 | |||
224 | deltaUps_ (map $ uncurry showUps -> us) = (mkUps $ back s, [mkUps $ u `diffUps` s | u <- us]) | ||
214 | where | 225 | where |
215 | s = foldr1 sect $ showUps <$> us | 226 | s = foldr1 sect $ us |
227 | |||
228 | crk (s, e) = (s, maxFreeVar $ getFreeVars e) | ||
229 | |||
230 | maxFreeVar (FreeVars i) = f 0 i where | ||
231 | f i 0 = i | ||
232 | f i n = f (i+1) (n `div` 2) | ||
216 | 233 | ||
217 | joinUps a b = foldr insertUp b a | 234 | joinUps a b = foldr insertUp b a |
218 | 235 | ||
219 | diffUpsTest xs | and $ zipWith (\a b -> s `joinUps` a == b) ys xs = "ok" | 236 | diffUpsTest xs | and $ zipWith (\a (b, _) -> s `joinUps` a == b) ys xs = show (s, ys) |
220 | where | 237 | where |
221 | (s, ys) = deltaUps xs | 238 | (s, ys) = deltaUps_ xs |
222 | 239 | ||
223 | diffUpsTest' = diffUpsTest [x,y] --diffUpsTest x y | 240 | diffUpsTest' = diffUpsTest [x,y] --diffUpsTest x y |
224 | where | 241 | where |
225 | x = [Up 1 2, Up 3 4, Up 8 2] | 242 | x = ([Up 1 2, Up 3 4, Up 8 2], 20) |
226 | y = [Up 2 2, Up 5 1, Up 6 2, Up 7 2] | 243 | y = ([Up 2 2, Up 5 1, Up 6 2, Up 7 2], 18) |
227 | 244 | ||
228 | insertUp u@(Up l 0) us = us | 245 | insertUp u@(Up l 0) us = us |
229 | insertUp u@(Up l n) [] = [u] | 246 | insertUp u@(Up l n) [] = [u] |
@@ -236,9 +253,13 @@ addUp (Up _ 0) e = e | |||
236 | addUp u (Exp s (Ups_ us e)) = Exp (rearr u s) $ Ups_ (insertUp u us) e | 253 | addUp u (Exp s (Ups_ us e)) = Exp (rearr u s) $ Ups_ (insertUp u us) e |
237 | addUp u e = Ups [u] e | 254 | addUp u e = Ups [u] e |
238 | 255 | ||
239 | pushUp u@(Up i num) e@(Exp s x) | 256 | pushUps :: Exp -> Exp_ |
240 | | dbGE i s = e | 257 | pushUps (Ups us (Exp _ e)) = foldr pushUp e us |
241 | | otherwise = Exp (rearrangeFreeVars (RFUp num) i s) $ case x of | 258 | pushUps (Exp _ e) = e |
259 | |||
260 | pushUp u@(Up i num) x | ||
261 | -- | dbGE i s = e | ||
262 | | otherwise = case x of | ||
242 | App_ a b -> App_ (f a) (f b) | 263 | App_ a b -> App_ (f a) (f b) |
243 | Seq_ a b -> Seq_ (f a) (f b) | 264 | Seq_ a b -> Seq_ (f a) (f b) |
244 | Con_ cn s xs -> Con_ cn s (f <$> xs) | 265 | Con_ cn s xs -> Con_ cn s (f <$> xs) |
@@ -283,8 +304,8 @@ down i x = Just $ down_ i x | |||
283 | 304 | ||
284 | down_ i e@(Exp s x) | 305 | down_ i e@(Exp s x) |
285 | | dbGE i s = e | 306 | | dbGE i s = e |
286 | down_ i (Ups us e) = f i us e where | 307 | down_ i0 e0@(Ups us e) = f i0 us e where |
287 | f i [] e = error $ "-- - - -- " ++ show i ++ " " ++ ppShow e ++ "\n" ++ ppShow (pushUps e) --"show down_ i e | 308 | f i [] e = error $ "-- - - -- " ++ show (i0, i) ++ " " ++ ppShow e0 ++ "\n" ++ ppShow e --(pushUps e) --"show down_ i e |
288 | f i (u@(Up j n): us) e | 309 | f i (u@(Up j n): us) e |
289 | | i < j = addUp (Up (j-1) n) $ f i us e | 310 | | i < j = addUp (Up (j-1) n) $ f i us e |
290 | | i >= j + n = addUp u $ f (i-n) us e | 311 | | i >= j + n = addUp u $ f (i-n) us e |
@@ -304,7 +325,7 @@ down_ i e@(Exp s x) = Exp (delVar i s) $ case x of | |||
304 | 325 | ||
305 | tryRemoves xs = tryRemoves_ (Var <$> freeVars xs) | 326 | tryRemoves xs = tryRemoves_ (Var <$> freeVars xs) |
306 | tryRemoves_ [] dt = dt | 327 | tryRemoves_ [] dt = dt |
307 | tryRemoves_ ((pushUps -> Var i): vs) dt | 328 | tryRemoves_ ((pushUps -> Var_ i): vs) dt |
308 | | Just dt' <- tryRemove_ i dt | 329 | | Just dt' <- tryRemove_ i dt |
309 | = tryRemoves_ (catMaybes $ down i <$> vs) dt' | 330 | = tryRemoves_ (catMaybes $ down i <$> vs) dt' |
310 | | otherwise = tryRemoves_ vs dt | 331 | | otherwise = tryRemoves_ vs dt |
@@ -352,8 +373,8 @@ instance MachineMonad Identity where | |||
352 | collectSizeStat _ = return () | 373 | collectSizeStat _ = return () |
353 | 374 | ||
354 | instance MachineMonad IO where | 375 | instance MachineMonad IO where |
355 | -- traceStep s = return () | 376 | traceStep s = return () |
356 | traceStep = putStrLn | 377 | -- traceStep = putStrLn |
357 | collectSizeStat s = return () | 378 | collectSizeStat s = return () |
358 | 379 | ||
359 | instance MachineMonad (Writer [Int]) where | 380 | instance MachineMonad (Writer [Int]) where |
@@ -378,11 +399,11 @@ runMachinePure e = putStr $ unlines $ ppShow t: [] | |||
378 | step :: MachineMonad m => MSt -> m MSt | 399 | step :: MachineMonad m => MSt -> m MSt |
379 | step dt@(MSt t e vs) = case pushUps e of | 400 | step dt@(MSt t e vs) = case pushUps e of |
380 | 401 | ||
381 | Int{} -> return dt | 402 | Int_{} -> return dt |
382 | 403 | ||
383 | Lam{} -> return dt | 404 | Lam_{} -> return dt |
384 | 405 | ||
385 | Con cn i xs | 406 | Con_ cn i xs |
386 | | lz /= 0 -> return $ MSt (ups' 1 lz t) (Con cn i xs') $ zs ++ vs -- share complex constructor arguments | 407 | | lz /= 0 -> return $ MSt (ups' 1 lz t) (Con cn i xs') $ zs ++ vs -- share complex constructor arguments |
387 | | otherwise -> return dt | 408 | | otherwise -> return dt |
388 | where | 409 | where |
@@ -392,43 +413,43 @@ step dt@(MSt t e vs) = case pushUps e of | |||
392 | f i (x: xs) | simple x = (up (Up 0 lz) x, []): f i xs | 413 | f i (x: xs) | simple x = (up (Up 0 lz) x, []): f i xs |
393 | | otherwise = (Var i, [up (Up 0 (lz - i - 1)) x]): f (i+1) xs | 414 | | otherwise = (Var i, [up (Up 0 (lz - i - 1)) x]): f (i+1) xs |
394 | 415 | ||
395 | Var i -> lookupHNF "var" (\e _ -> e) i dt | 416 | Var_ i -> lookupHNF "var" (\e _ -> e) i dt |
396 | 417 | ||
397 | Seq a b -> case pushUps a of | 418 | Seq_ a b -> case pushUps a of |
398 | Int{} -> stepMsg "seq" $ MSt t b vs | 419 | Int_{} -> stepMsg "seq" $ MSt t b vs |
399 | Lam{} -> stepMsg "seq" $ tryRemoves (getFreeVars a) $ MSt t b vs | 420 | Lam_{} -> stepMsg "seq" $ tryRemoves (getFreeVars a) $ MSt t b vs |
400 | Con{} -> stepMsg "seq" $ tryRemoves (getFreeVars a) $ MSt t b vs | 421 | Con_{} -> stepMsg "seq" $ tryRemoves (getFreeVars a) $ MSt t b vs |
401 | Var i -> lookupHNF' "seqvar" (\e (pushUps -> Seq _ b) -> b) i dt | 422 | Var_ i -> lookupHNF' "seqvar" (\e (pushUps -> Seq_ _ b) -> b) i dt |
402 | _ -> stepMsg "seqexp" $ MSt (ups' 1 1 t) (Seq (Var 0) $ up (Up 0 1) b) $ a: vs | 423 | _ -> stepMsg "seqexp" $ MSt (ups' 1 1 t) (Seq (Var 0) $ up (Up 0 1) b) $ a: vs |
403 | 424 | ||
404 | -- TODO: handle recursive constants | 425 | -- TODO: handle recursive constants |
405 | Y (pushUps -> Lam x) -> stepMsg "Y" $ MSt (ups' 1 1 t) x $ e: vs | 426 | Y_ (pushUps -> Lam_ x) -> stepMsg "Y" $ MSt (ups' 1 1 t) x $ e: vs |
406 | 427 | ||
407 | App a b -> case pushUps a of | 428 | App_ a b -> case pushUps a of |
408 | Lam x | usedVar 0 x | 429 | Lam_ x | usedVar 0 x |
409 | -> stepMsg "app" $ MSt (ups' 1 1 t) x $ b: vs | 430 | -> stepMsg "app" $ MSt (ups' 1 1 t) x $ b: vs |
410 | Lam x -> stepMsg "appdel" $ tryRemoves (getFreeVars b) $ MSt t x vs | 431 | Lam_ x -> stepMsg "appdel" $ tryRemoves (getFreeVars b) $ MSt t x vs |
411 | Var i -> lookupHNF' "appvar" (\e (pushUps -> App _ y) -> App e y) i dt | 432 | Var_ i -> lookupHNF' "appvar" (\e (pushUps -> App_ _ y) -> App e y) i dt |
412 | _ -> stepMsg "appexp" $ MSt (ups' 1 1 t) (App (Var 0) $ up (Up 0 1) b) $ a: vs | 433 | _ -> stepMsg "appexp" $ MSt (ups' 1 1 t) (App (Var 0) $ up (Up 0 1) b) $ a: vs |
413 | 434 | ||
414 | Case a cs -> case pushUps a of | 435 | Case_ a cs -> case pushUps a of |
415 | Con cn i es -> stepMsg "case" $ tryRemoves (foldMap (getFreeVars . snd) $ delElem i cs) $ (MSt t (foldl App (snd $ cs !! i) es) vs) | 436 | Con_ cn i es -> stepMsg "case" $ tryRemoves (foldMap (getFreeVars . snd) $ delElem i cs) $ (MSt t (foldl App (snd $ cs !! i) es) vs) |
416 | Var i -> lookupHNF' "casevar" (\e (pushUps -> Case _ cs) -> Case e cs) i dt | 437 | Var_ i -> lookupHNF' "casevar" (\e (pushUps -> Case_ _ cs) -> Case e cs) i dt |
417 | _ -> stepMsg "caseexp" $ MSt (ups' 1 1 t) (Case (Var 0) $ second (up (Up 0 1)) <$> cs) $ a: vs | 438 | _ -> stepMsg "caseexp" $ MSt (ups' 1 1 t) (Case (Var 0) $ second (up (Up 0 1)) <$> cs) $ a: vs |
418 | 439 | ||
419 | Op2 op x y -> case (pushUps x, pushUps y) of | 440 | Op2_ op x y -> case (pushUps x, pushUps y) of |
420 | (Int e, Int f) -> return $ MSt t (int op e f) vs | 441 | (Int_ e, Int_ f) -> return $ MSt t (int op e f) vs |
421 | where | 442 | where |
422 | int Add a b = Int $ a + b | 443 | int Add a b = Int $ a + b |
423 | int Sub a b = Int $ a - b | 444 | int Sub a b = Int $ a - b |
424 | int Mod a b = Int $ a `mod` b | 445 | int Mod a b = Int $ a `mod` b |
425 | int LessEq a b = if a <= b then T else F | 446 | int LessEq a b = if a <= b then T else F |
426 | int EqInt a b = if a == b then T else F | 447 | int EqInt a b = if a == b then T else F |
427 | (Var i, _) -> lookupHNF' "op2-1var" (\e (pushUps -> Op2 op _ y) -> Op2 op e y) i dt | 448 | (Var_ i, _) -> lookupHNF' "op2-1var" (\e (pushUps -> Op2_ op _ y) -> Op2 op e y) i dt |
428 | (_, Var i) -> lookupHNF' "op2-2var" (\e (pushUps -> Op2 op x _) -> Op2 op x e) i dt | 449 | (_, Var_ i) -> lookupHNF' "op2-2var" (\e (pushUps -> Op2_ op x _) -> Op2 op x e) i dt |
429 | (Int{}, _) -> stepMsg "op2" $ MSt (ups' 1 1 t) (Op2 op x (Var 0)) $ y: vs | 450 | (Int_{}, _) -> stepMsg "op2" $ MSt (ups' 1 1 t) (Op2 op x (Var 0)) $ y: vs |
430 | (_, Int{}) -> stepMsg "op2" $ MSt (ups' 1 1 t) (Op2 op (Var 0) y) $ x: vs | 451 | (_, Int_{}) -> stepMsg "op2" $ MSt (ups' 1 1 t) (Op2 op (Var 0) y) $ x: vs |
431 | _ -> stepMsg "op2" $ MSt (ups' 1 2 t) (Op2 op (Var 0) (Var 1)) $ x: y: vs | 452 | _ -> stepMsg "op2" $ MSt (ups' 1 2 t) (Op2 op (Var 0) (Var 1)) $ x: y: vs |
432 | 453 | ||
433 | stepMsg :: MachineMonad m => String -> MSt -> m MSt | 454 | stepMsg :: MachineMonad m => String -> MSt -> m MSt |
434 | stepMsg msg dt = do | 455 | stepMsg msg dt = do |