Changeset 6
- Timestamp:
- Nov 12, 2012, 4:06:50 AM (13 years ago)
- Location:
- sizechecking
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
sizechecking/Constraints.hs
r5 r6 12 12 import Data.SBV ( (.==), (.<), (.>=)) 13 13 import Control.Monad 14 import Data.IORef 14 import Data.IORef() 15 15 import Data.Supply as S 16 16 17 17 asType :: a -> a -> a 18 asType a b= a18 asType a _ = a 19 19 20 20 data D = D { var::Int, cond::[Condition] } … … 36 36 37 37 appall :: Int -> [L] -> L 38 appall var l = foldl (App) (Var $ var) $ l38 appall var = foldl App (Var var) 39 39 40 40 … … 76 76 [] -> (Num 0, b) 77 77 _ -> (expr, b) 78 (_, _) -> error $ "Expression in condition" ++ (show c)78 (_, _) -> error $ "Expression in condition" ++ show c 79 79 where 80 80 nonzero = List.sortBy (Ord.comparing snd) $ filter ((/=0).fst) a … … 111 111 norm (AAbs a b e) = ([], 0, [AAbs a b (normalize e)], []) 112 112 norm (Shift a b c) = ([], 0, [Shift (normalize a) (normalize b) (normalize c)], []) 113 norm (Aggr a b c) = ([], 0, [Aggr a (normalize b) (normalize c)], [])114 113 norm (Unsized) = ([], 0, [Unsized], []) 115 114 norm (Bottom) = ([], 0, [Bottom], []) … … 159 158 l1 <- checkCond1 v1 (Condition ((h `LTC` f):d) e' x) 160 159 l2 <- checkCond1 v2 (Condition ((h `GEC` f):d) g' x) 161 putStrLn $ " -> " ++ (show l1)162 putStrLn $ " -> " ++ (show l2)160 putStrLn $ " -> " ++ show l1 161 putStrLn $ " -> " ++ show l2 163 162 return $ l1 ++ l2 164 checkCond1 v z@(Condition d (App (Var a) x) (App (Var b) y)) | a==b = do163 checkCond1 v z@(Condition d (App (Var a) x) (App (Var b) y)) | a==b = 165 164 checkCond1 v (Condition d x y) 166 checkCond1 v p@(Condition d x z@(App (Shift e f g) h)) = do165 checkCond1 v p@(Condition d x z@(App (Shift e f g) h)) = 167 166 checkCond1 v (Condition d z x) 168 checkCond1 v z@(Condition d a b) = return $[Condition dd (normalize a) (normalize b)]167 checkCond1 v z@(Condition d a b) = return [Condition dd (normalize a) (normalize b)] 169 168 where 170 169 dd = normalizecs d … … 174 173 subst ndl hst (AAbs a b e) = AAbs a b (subst ndl hst e) 175 174 subst ndl hst (Shift a b c) = Shift (subst ndl hst a) (subst ndl hst b) (subst ndl hst c) 176 subst ndl hst (Aggr a b c) = Aggr a (subst ndl hst b) (subst ndl hst c)177 175 subst ndl hst (Unsized) = Unsized 178 176 subst ndl hst (Bottom) = Bottom … … 201 199 solve l supply = do 202 200 ll <- forM (zip l $ split supply) (\(c,s) -> do 203 putStrLn $ "\nSOLVING " ++(show c)201 putStrLn $ "\nSOLVING " ++ show c 204 202 solve1 s c 205 203 ) … … 227 225 228 226 checkConds [] = False 229 checkConds ( (LTC a b):xs) | (elem (GEC a b) xs)= True230 checkConds ( (GEC a b):xs) | (elem (LTC a b) xs)= True231 checkConds ( (LTC a (Num b)):xs) | b<=0 && elem (Zero a) xs = True232 checkConds ( (GEC a (Num b)):xs) | b>0 && elem (Zero a) xs = True227 checkConds (LTC a b : xs) | GEC a b `elem` xs = True 228 checkConds (GEC a b : xs) | LTC a b `elem` xs = True 229 checkConds (LTC a (Num b) : xs) | b<=0 && elem (Zero a) xs = True 230 checkConds (GEC a (Num b) : xs) | b>0 && elem (Zero a) xs = True 233 231 checkConds (_:xs) = checkConds xs 234 232 … … 259 257 return [] 260 258 | a==b = do 261 putStrLn $"Equals"259 putStrLn "Equals" 262 260 return [] 263 261 | Just (var, nl) <- searchzero d = do 264 let x = (Condition (Prelude.map (normalizec.substc var (Num 0)) nl)262 let x = Condition (Prelude.map (normalizec.substc var (Num 0)) nl) 265 263 (normalize$subst var (Num 0) a) 266 264 (normalize$subst var (Num 0) b) 267 ) 268 putStrLn $ (show $ Var var) ++" is zero:\n" ++ (show x)265 266 putStrLn $ show (Var var) ++ " is zero:\n" ++ show x 269 267 solve1 supp x 270 268 | Just (var, exp, nl) <- searcheq d [] = do 271 putStrLn $ "Found equation " ++(show $ Var var) ++ " = "++(show exp)272 let x = (Condition (Prelude.map (normalizec.substc var exp) nl )269 putStrLn $ "Found equation " ++ show (Var var) ++ " = " ++ show exp 270 let x = Condition (Prelude.map (normalizec.substc var exp) nl ) 273 271 (normalize$subst var exp a) 274 272 (normalize$subst var exp b) 275 ) 276 putStrLn $ "New equations:\n" ++ (show x) 273 putStrLn $ "New equations:\n" ++ show x 277 274 solve1 supp x 278 275 | App p q <- a, App r s <- b = do 279 putStrLn $"Branching!"276 putStrLn "Branching!" 280 277 nc <- checkCond supp [Condition d p r, Condition d q s] 281 278 solve nc supp … … 291 288 -- | Abs _ _ <- a, AAbs _ _ _ <- b = applyList a b d supp 292 289 -- | AAbs _ _ _ <- a, AAbs _ _ _ <- b = applyList a b d supp 293 | Just dd <- reorder d = do 294 putStrLn $ "Reorder " ++ (show dd)290 | Just dd <- reorder d = do 291 putStrLn $ "Reorder " ++ show dd 295 292 solve1 supp $ Condition dd a b 296 293 | otherwise = do … … 309 306 compiletosolver :: L -> L -> [Constraint] -> SBV.Symbolic SBV.SBool 310 307 compiletosolver a b d = do 311 let fvs = Set.toList $ Set.unions $ (fv a):(fv b):(map fvc d)312 (vars::[SBV.SInteger]) <- mapM SBV.free $ map (flip showVar "") fvs308 let fvs = Set.toList $ Set.unions $ fv a : fv b : map fvc d 309 (vars::[SBV.SInteger]) <- mapM (SBV.free . flip showVar "") fvs 313 310 let varmap = Map.fromList $ zip fvs vars 314 mapM SBV.constrain $ map (compilec varmap) d315 return $ (compilel varmap a) .== (compilel varmap b)311 mapM_ (SBV.constrain . compilec varmap) d 312 return $ compilel varmap a .== compilel varmap b 316 313 317 314 compilec v (Zero a) = compilel v a .== (0::SBV.SInteger) … … 329 326 compilel v (Var a) | Just x<-Map.lookup a v = x 330 327 compilel v (Num a) = SBV.literal $ fromIntegral a 331 compilel v a = error $ "Cannot compile " ++(show a)328 compilel v a = error $ "Cannot compile " ++ show a -
sizechecking/Lambda.hs
r5 r6 12 12 13 13 data L = Abs Int L | App L L | Var Int | Num Int | Op L Char L | List L L | AAbs Int Int L 14 | Shift L L L | Unsized | Bottom | Aggr String L L14 | Shift L L L | Unsized | Bottom 15 15 deriving Eq 16 16 17 17 showVar x = if x>28 18 then showVar (x `div` 29) . (showChar $chr $ ord 'a' + (x `mod` 29))18 then showVar (x `div` 29) . showChar (chr $ ord 'a' + (x `mod` 29)) 19 19 else showChar $ chr $ ord 'a' + x 20 20 … … 24 24 getPrec '*' = (5,5,6) 25 25 getPrec '/' = (5,5,6) 26 getPrec c = error $ "Unknown operator "++[c] 26 27 27 28 instance Show L where 28 showsPrec p (Abs s l) = showParen (p>0) $ showChar 'λ' . showVar s . showChar '.' . shows Prec 0l29 showsPrec p (AAbs f s l) = showParen (p>0) $ showChar 'Î' . showVar f . showChar ',' . showVar s . showChar '.' . shows Prec 0l29 showsPrec p (Abs s l) = showParen (p>0) $ showChar 'λ' . showVar s . showChar '.' . shows l 30 showsPrec p (AAbs f s l) = showParen (p>0) $ showChar 'Î' . showVar f . showChar ',' . showVar s . showChar '.' . shows l 30 31 showsPrec p (App m n) = showParen (p>6) $ showsPrec 6 m . showChar ' ' . showsPrec 7 n 31 showsPrec p(Var s) = showVar s32 showsPrec p(Num i) = shows i32 showsPrec _ (Var s) = showVar s 33 showsPrec _ (Num i) = shows i 33 34 showsPrec p (Op m op n) = showParen (p>prec) $ showsPrec lprec m . showChar op . showsPrec rprec n 34 35 where (prec,lprec,rprec)=getPrec op … … 36 37 showsPrec p (Shift e1 s e2) = showParen (p>0) $ showString "Shift " .showsPrec 2 e1 . 37 38 showChar ' ' . showsPrec 2 s . showChar ' ' . showsPrec 2 e2 38 showsPrec p Bottom = showChar 'âŽ' 39 showsPrec p Unsized = showChar 'U' 40 showsPrec p (Aggr name e1 e2) = showParen (p>0) $ showString name .showChar ' ' . showsPrec 2 e1 . showChar ' ' . showsPrec 2 e2 39 showsPrec _ Bottom = showChar 'âŽ' 40 showsPrec _ Unsized = showChar 'U' 41 41 42 42 t3s = Abs 1 $ Abs 0 $ App t (App t (App t x)) … … 47 47 subs (List s f) var exp = List (subs s var exp) (subs f var exp) 48 48 subs (Shift e1 e2 e3) var exp = Shift (subs e1 var exp) (subs e2 var exp) (subs e3 var exp) 49 subs (Aggr name e1 e2) var exp = Aggr name (subs e1 var exp) (subs e2 var exp)50 49 subs (Op x c z) var exp = Op (subs x var exp) c (subs z var exp) 51 50 subs e@(Var v) var exp | v==var = exp … … 55 54 subs x@(AAbs s f e) var exp | s==var||f==var = x 56 55 | otherwise = AAbs s f (subs e var exp) 57 subs x@(Num _) var exp= x58 subs x@Bottom var exp= x59 subs x@Unsized var exp= x56 subs x@(Num _) _ _ = x 57 subs x@Bottom _ _ = x 58 subs x@Unsized _ _ = x 60 59 61 60 … … 68 67 alpha e@Bottom _ _ = e 69 68 alpha e@Unsized _ _ = e 70 alpha x@(Abs v e) from to | v==from = Abs to (alpha' e from to)71 72 alpha x@(AAbs v1 v2 e) from to | v1==from = AAbs to v2 (alpha' e from to)73 74 69 alpha (Abs v e) from to | v==from = Abs to (alpha' e from to) 70 | otherwise = Abs v (alpha e from to) 71 alpha (AAbs v1 v2 e) from to | v1==from = AAbs to v2 (alpha' e from to) 72 | v2==from = AAbs v1 to (alpha' e from to) 73 | otherwise = AAbs v1 v2 (alpha e from to) 75 74 76 75 alpha' (App x z) from to = App (alpha' x from to) (alpha' z from to) … … 80 79 alpha' e@(Var v) from to | v==from = Var to 81 80 | otherwise = e 82 alpha' x@(Abs v e) from to | v==from = Abs to (alpha' e from to)83 84 alpha' x@(AAbs v1 v2 e) from to | v1==from = AAbs to v2 (alpha' e from to)85 86 81 alpha' (Abs v e) from to | v==from = Abs to (alpha' e from to) 82 | otherwise = Abs v (alpha' e from to) 83 alpha' (AAbs v1 v2 e) from to | v1==from = AAbs to v2 (alpha' e from to) 84 | v2==from = AAbs v1 to (alpha' e from to) 85 | otherwise = AAbs v1 v2 (alpha' e from to) 87 86 alpha' x@(Num _) _ _ = x 88 87 alpha' x@Bottom _ _ = x … … 95 94 fv (AAbs x y e) = x `Set.delete` ( y `Set.delete` fv e) 96 95 fv (List s e) = fv s `Set.union` fv e 97 fv (Num i) = Set.empty96 fv (Num _) = Set.empty 98 97 fv (Shift e1 e2 e3) = fv e1 `Set.union` fv e2 `Set.union` fv e3 99 fv (Aggr _ e1 e2) = fv e1 `Set.union` fv e2100 98 fv Unsized = Set.empty 101 99 fv Bottom = Set.empty 102 100 103 bv (Var x) = Set.empty101 bv (Var _) = Set.empty 104 102 bv (App x y) = bv x `Set.union` bv y 105 103 bv (Op x _ y) = bv x `Set.union` bv y … … 108 106 bv (AAbs v1 v2 e) = v1 `Set.insert` (v2 `Set.insert` bv e) 109 107 bv (Shift e1 e2 e3) = bv e1 `Set.union` bv e2 `Set.union` bv e3 110 bv (Aggr _ e1 e2) = bv e1 `Set.union` bv e2 111 bv (Num i) = Set.empty 108 bv (Num _) = Set.empty 112 109 bv Unsized = Set.empty 113 110 bv Bottom = Set.empty 114 111 115 112 maxv (Var x) = x 116 maxv (Num i) = 0113 maxv (Num _) = 0 117 114 maxv Unsized = 0 118 115 maxv Bottom = 0 … … 126 123 rsubs oexp var exp = subs renamed var exp 127 124 where 128 dvar = (fv exp) `Set.intersection` (bv oexp)125 dvar = fv exp `Set.intersection` bv oexp 129 126 m = maxv exp `max` maxv oexp 130 127 renames = zip (Set.toList dvar) [m+1..] 131 128 renamed = foldr rename oexp renames 132 rename (from,to) exp= alpha oexp from to133 129 rename (from,to) _ = alpha oexp from to 130 134 131 135 132 reduce (App (Abs var exp) z) = return $ rsubs exp var z … … 152 149 Just e' -> return $ Shift e1 e' e3 153 150 _ -> reduce e3 >>= \e' -> return $ Shift e1 e2 e' 154 reduce (Aggr name e1 e2) = case reduce e1 of155 Just e -> return $ Aggr name e e2156 Nothing -> do157 e <- reduce e2158 return $ Aggr name e1 e159 151 reduce (Op m c n) = case c of 160 152 '+' | (Num i, Num j) <- (m,n) -> return $ Num $ i+j … … 177 169 it f x = it' f (Just x) 178 170 where 179 it' fNothing = []171 it' _ Nothing = [] 180 172 it' f (Just x) = x:it' f (f x) 181 173 182 174 rchain :: L -> [L] 183 rchain exp = it reduce exp175 rchain = it reduce 184 176 185 177 pchain = putStrLn . intercalate "\n-> " . map show . rchain … … 205 197 lfalse = Abs 0 $ Abs 1 $ Var 1 206 198 207 liszero = Abs n $ App (App (Var n) (Abs x $lfalse)) ltrue199 liszero = Abs n $ App (App (Var n) (Abs x lfalse)) ltrue 208 200 where (n,x) = (0,1) 209 201 … … 229 221 y = Abs 18 $ App (Abs 22 $ App (Var 18) (App (Var 22) (Var 22))) (Abs 22 $ App (Var 18) (App (Var 22) (Var 22))) 230 222 -- Îs,g.List s (λi.(λx.Ît,f.List (1+t) (Shift f (t-1) x)) U (g i)) 231 transposes = AAbs 18 5 $ List ( App (AAbs 15 6 $ Var 15) (Aggr "max" (Var 18) (Var 5)) )-- (App (Var 5) (Num 0)) )232 (Abs 8 $ List (Var 18) $ Abs 9 $ App (AAbs 15 6 $ App (Var 6) (Var 8)) (App (Var 5) (Var 9)))233 223 reverses = AAbs 18 5 $ List (Var 18) (Abs 8 $ App (Var 5) $ Op (Op (Var 18) '-' (Num 1)) '-' (Var 8) ) 234 224 reverse' l = case l of
Note: See TracChangeset
for help on using the changeset viewer.