Changeset 12


Ignore:
Timestamp:
Nov 15, 2012, 12:44:36 AM (13 years ago)
Author:
gobi
Message:

code cleanup

Location:
sizechecking
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • sizechecking/Examples.hs

    r11 r12  
    44import Lambda 
    55import SizedExp 
    6 import Prelude (($)) 
    7 import Constraints 
    8 import Prelude ( (+), (-), Int, (==), (*), (<), (>), (<=), (>=), (/=) ) 
     6import Constraints() 
     7import Prelude ( ($), (+), (-), Int, (==), (*), (<), (>), (<=), (>=), (/=) ) 
    98import qualified Prelude as P 
    109import qualified Control.Monad as M 
    1110import qualified Data.List as List 
    12 import Debug.Trace 
    1311 
    1412head :: (SizedExp se ) => Size se ([l] -> l) 
    1513head = bind headc body 
    1614    where  
    17     body l = match l true (\x xs -> x)  
     15    body l = match l true P.const 
    1816 
    1917tail :: (SizedExp se ) => Size se ([l] -> [l]) 
    2018tail = bind tailc body 
    21     where body l = match l true (\x xs -> xs)  
     19    where body l = match l true (\_ xs -> xs) 
    2220 
    2321cons :: (SizedExp se) => Size se (x -> [x] -> [x]) 
     
    2826    where body f x = f `app` (f `app` (f `app` x)) 
    2927 
    30 nil :: (SizedExp se) => Size se ([x]) 
     28nil :: (SizedExp se) => Size se [x] 
    3129nil  = bind nils true 
    3230 
    3331map :: (SizedExp se)  => Size se ( (a->b) -> [a] -> [b] ) 
    3432map = bind smap body 
    35     where body f l = match l (nil) 
     33    where body f l = match l nil 
    3634            ( \x xs ->  cons `app` (f `app` x) `app` (map `app` f `app` xs )) 
    3735 
     
    4442append :: (SizedExp se) => Size se ([a] -> [a] -> [a]) 
    4543append = bind appends body 
    46     where body l1 l2 = match l1 (l2) 
     44    where body l1 l2 = match l1 l2 
    4745            (\x xs -> cons `app` x `app` (append `app` xs `app` l2)) 
    4846 
     
    5957 
    6058pam :: (SizedExp se) => Size se ([a -> b] -> a -> [b]) 
    61 pam = bind (AAbs 1 2 $ Abs 3 $ List (Var 1) (Abs 4 $ (App (App (Var 2) (Var 4)) (Var 3)))) $ \fl x -> match fl (nil) 
     59pam = bind (AAbs 1 2 $ Abs 3 $ List (Var 1) (Abs 4 $ App (App (Var 2) (Var 4)) (Var 3))) $ \fl x -> match fl nil 
    6260    (\f fs -> cons `app` (f `app` x) `app` (pam `app` fs `app` x)) 
    6361 
    6462reverse :: (SizedExp se) => Size se([a] -> [a]) 
    65 reverse = bind reverses $ \l -> match l ( 
     63reverse = bind reverses $ \l -> match l 
    6664                nil 
    67             )( 
     65            ( 
    6866                \x xs -> append `app` (reverse `app` xs) `app` (cons `app` x `app` nil) 
    6967            ) 
     
    8886        \f x -> t3 `app` (t3 `app` f) `app` x 
    8987 
    90 add27s = (AAbs 0 1 $ List (Op (Var 0) '+' (Num 27)) (Abs 2 Unsized)) 
     88add27s :: L 
     89add27s = AAbs 0 1 $ List (Op (Var 0) '+' (Num 27)) (Abs 2 Unsized) 
    9190add27 :: (SizedExp se) => Size se ([P.Int] -> [P.Int]) 
    9291add27 = bind add27s $ \x ->  t27 `app` addone `app` x 
    9392 
    9493 
     94zipWiths :: L 
    9595zipWiths = let q = App (Var 4) $ Op (Op (Var 5) '+' (Var 3)) '-' (Var 1)  in 
    9696    (Abs 0 $ AAbs 1 2 $ AAbs 3 4 $ List (Var 1) (Abs 5 $ App (App (Var 0) (App (Var 2) (Var 5))) q )) 
    9797zipWith :: (SizedExp se) => Size se ((a2 -> a1 -> a) -> [a2] -> [a1] -> [a]) 
    9898zipWith = bind zipWiths $ \f l1 l2 -> 
    99         match l1 ( 
     99        match l1 
    100100            nil 
    101         ) ( 
    102             \x xs -> match l2 ( 
     101        ( 
     102            \x xs -> match l2  
    103103                true 
    104             ) ( 
     104            ( 
    105105                \y ys -> cons `app` (f `app` x `app` y) `app` (zipWith `app` f `app` xs `app` ys) 
    106106            ) 
    107107        ) 
    108108appAll :: (SizedExp se) => Size se ( [a -> b] -> a -> [b] ) 
    109 appAll = bind (AAbs 0 1 $ Abs 2 $ List (Var 0) (Abs 3 $ Var 1 `App` Var 3 `App` Var 2 ) ) $ \fl x -> match fl (  
    110             nil  
    111         ) (  
     109appAll = bind (AAbs 0 1 $ Abs 2 $ List (Var 0) (Abs 3 $ Var 1 `App` Var 3 `App` Var 2 ) ) $ \fl x -> match fl  
     110            nil 
     111        ( 
    112112            \f fs -> cons `app` (f `app` x) `app` (appAll `app` fs `app` x) 
    113113        ) 
     
    129129sqdiff = bind (let sq l = Op l '*' l in AAbs 0 1 $ AAbs 2 3 $ List (sq $ Op (Var 0) '-' (Var 2)) $ Abs 4 $ List (Num 2) $ Abs 5 Unsized) $ 
    130130    \l1 l2 -> match l1 (cprod `app` l2 `app` l2) 
    131         (\hd1 tl1 -> match l2 (cprod `app` l1 `app` l1) 
    132             (\hd2 tl2 -> sqdiff `app` tl1 `app` tl2)) 
     131        (\_ tl1 -> match l2 (cprod `app` l1 `app` l1) 
     132            (\_ tl2 -> sqdiff `app` tl1 `app` tl2)) 
    133133 
    134134replace :: SizedExp se => Size se (Int -> [Int] -> [Int]) 
    135135replace = bind (Abs 0 $ AAbs 1 2 $ List (Var 1) (Abs 3 Unsized)) $ 
    136     \x l -> match l (nil) (\hd tl -> cons `app` (x+hd) `app` tl) 
    137  
    138 scalar_prod :: (SizedExp se0) =>  Size se0 ([Int] -> [Int] -> [Int]) 
    139 scalar_prod = bind (AAbs 0 1 $ AAbs 2 3 $ List (Num 1) (Abs 4  Unsized)) $  
     136    \x l -> match l nil (\hd tl -> cons `app` (x+hd) `app` tl) 
     137 
     138scalarProd :: (SizedExp se0) =>  Size se0 ([Int] -> [Int] -> [Int]) 
     139scalarProd = bind (AAbs 0 1 $ AAbs 2 3 $ List (Num 1) (Abs 4  Unsized)) $  
    140140    \l1 l2 -> match l1 ( 
    141141        match l2 ( cons `app` 0 `app` nil )  
    142             (\hd2 tl2 -> true) 
     142            (\_ _ -> true) 
    143143    ) ( \hd1 tl1 -> 
    144         match l2 (true)  
    145             ( \hd2 tl2 -> replace `app` (hd1 * hd2) `app` (scalar_prod `app` tl1 `app` tl2) ) 
     144        match l2 true 
     145            ( \hd2 tl2 -> replace `app` (hd1 * hd2) `app` (scalarProd `app` tl1 `app` tl2) ) 
    146146    ) 
    147147 
     
    157157 
    158158take4 :: SizedExp se => Size se (([a] -> [a]) -> [[a]]) 
    159 take4 = bind (Abs 0 $ List (Num 1) (Abs 2 (Var 0 `App` (Var 0 `App` List (Num 0) (Abs 1 $ Bottom))))) $ 
     159take4 = bind (Abs 0 $ List (Num 1) (Abs 2 (Var 0 `App` (Var 0 `App` List (Num 0) (Abs 1 Bottom))))) $ 
    160160    \f ->cons `app` (f `app` (f `app` nil) ) `app` nil 
    161161 
    162162 
    163163merge :: SizedExp se => Size se ([Int] -> [Int] -> [Int]) 
    164 merge = bind (AAbs 0 1 $ AAbs 2 3 $ List (Op (Var 0) '+' (Var 2)) (Abs 4 $ Unsized))$ 
     164merge = bind (AAbs 0 1 $ AAbs 2 3 $ List (Op (Var 0) '+' (Var 2)) (Abs 4 Unsized))$ 
    165165    \l1 l2 -> match l1 l2 ( 
    166166        \x xs -> match l2 l1 ( 
     
    171171 
    172172split1 :: SizedExp se => Size se ([Int] -> [Int]) 
    173 split1 = bind (AAbs 0 1 $ List (Op (Op (Var 0) '+' (Num 1))'/' (Num 2)) (Abs 2 $ Unsized))  $ 
     173split1 = bind (AAbs 0 1 $ List (Op (Op (Var 0) '+' (Num 1))'/' (Num 2)) (Abs 2 Unsized))  $ 
    174174    \z -> match z nil (\y ys -> cons `app` y `app` (split2 `app` ys)) 
    175175 
    176176split2 :: SizedExp se => Size se ([Int] -> [Int]) 
    177 split2 = bind (AAbs 0 1 $ List (Op (Var 0) '/' (Num 2)) (Abs 2 $ Unsized)) $ 
     177split2 = bind (AAbs 0 1 $ List (Op (Var 0) '/' (Num 2)) (Abs 2 Unsized)) $ 
    178178    \z -> match z nil (\y ys -> split1 `app` ys) 
    179179 
    180 ms = (AAbs 0 1 $ List (Var 0) (Abs 4 $ Unsized)) 
     180ms = AAbs 0 1 $ List (Var 0) (Abs 4 Unsized) 
    181181mergesort :: SizedExp se => Size se ([Int] -> [Int]) 
    182182mergesort = bind ms $ 
     
    194194 
    195195fix :: SizedExp se => Size se ((a -> a) -> a) 
    196 fix = bind (Abs 2 $ App y (Var 2)) $  
     196fix = bind (Abs 2 $ App yComb (Var 2)) $  
    197197    \f -> f `app` (fix `app` f) 
    198198 
     
    202202        \x xs -> cons `app` (cons `app` x `app` (heads `app` xss)) 
    203203            `app` (transpose `app` (cons `app` xs `app` (tails `app` xss))) 
    204 transposec = (AAbs 18 5 $ List len fun )  
     204transposec = AAbs 18 5 $ List len fun 
    205205    where 
    206     len = (AAbs 19 6 $ (Var 19) ) `App` (Var 5 `App` Num 0) 
    207     fun = Abs 8 $ List (Var 18) (Abs 9 $  (AAbs 19 6 $ Var 6 `App` Var 8 ) `App` (Var 5 `App` Var 9) ) 
    208  
    209 comps = (Abs 2 $ Abs 3 $ Abs 4 $ App (Var 2) (App (Var 3) (Var 4)) ) 
     206    len = AAbs 19 6 (Var 19) `App` (Var 5 `App` Num 0) 
     207    fun = Abs 8 $ List (Var 18) (Abs 9 $ AAbs 19 6 (Var 6 `App` Var 8) `App` (Var 5 `App` Var 9)) 
     208 
     209comps = Abs 2 $ Abs 3 $ Abs 4 $ App (Var 2) (App (Var 3) (Var 4)) 
    210210comp :: (SizedExp se)  => Size se ( (b->c) -> (a->b) -> a->c ) 
    211211comp = bind comps $ \f g x -> f `app` (g `app` x) 
    212212 
    213 test1s = Abs 2 $ AAbs 19 6 $ (Var 2) `App` (List (Var 19) (Var 6)) 
     213test1s = Abs 2 $ AAbs 19 6 $ Var 2 `App` List (Var 19) (Var 6) 
    214214test1 :: (SizedExp se)  => Size se (([a] -> [b]) -> [a] -> [b]) 
    215215test1 = bind test1s $ \f l -> match (f `app` l) nil (\x xs -> f `app` l) 
    216216 
    217217 
    218 test2s = Abs 2 $ AAbs 18 5  $ appends `App` (Var 2 `App` (List (Var 18) (Var 5))) `App` (List (Var 18) (Var 5)) 
     218test2s = Abs 2 $ AAbs 18 5  $ appends `App` (Var 2 `App` List (Var 18) (Var 5)) `App` List (Var 18) (Var 5) 
    219219test2 :: (SizedExp se)  => Size se (([a] -> [a]) -> [a] -> [a]) 
    220220test2 = bind test2s $ \f l -> append `app` (f `app` l) `app` l 
     
    244244        , TestCase "appAll" appAll 
    245245        , TestCase "conspack" conspack 
    246         , TestCase "scalar_prod" scalar_prod 
     246        , TestCase "scalarProd" scalarProd 
    247247        , TestCase "sqdiff" sqdiff 
    248248        , TestCase "mlist" mlist 
     
    255255runTests = do 
    256256    failed <- M.forM tests $ \(TestCase name test) -> do 
    257         P.print$ " +++++++++++++++++++++++++++++++" 
    258         P.print$ " +  Proving " P.++ name 
    259         P.print$ " +++++++++++++++++++++++++++++++" 
     257        P.print " +++++++++++++++++++++++++++++++" 
     258        P.print $ " +  Proving " P.++ name 
     259        P.print " +++++++++++++++++++++++++++++++" 
    260260 
    261261        s <- prove test 
    262         if P.not s then 
    263             M.return [name] 
    264           else 
    265             M.return [] 
     262        M.return [name | P.not s] 
    266263 
    267264    let f = P.concat failed 
     
    269266        P.putStrLn "All ok." 
    270267      else do 
    271         P.putStr $ "\n\nFailed test cases: " 
     268        P.putStr "\n\nFailed test cases: " 
    272269        P.putStrLn $ List.intercalate ", " f 
    273270 
  • sizechecking/Lambda.hs

    r6 r12  
    219219dupfst = AAbs 19 5 $ List (Op (Num 1) '+' (Var 19)) $ Shift (Var 5) (Op (Var 19) '-' (Num 1))  
    220220    $ Abs 8 $ App (Var 5) (Op (Var 19) '-' (Num 1)) 
    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))) 
     221yComb = Abs 18 $ App (Abs 22 $ App (Var 18) (App (Var 22) (Var 22))) (Abs 22 $ App (Var 18) (App (Var 22) (Var 22))) 
    222222-- Λs,g.List s (λi.(λx.Λt,f.List (1+t) (Shift f (t-1) x)) U (g i)) 
    223223reverses = AAbs 18 5 $ List (Var 18) (Abs 8 $ App (Var 5) $ Op (Op (Var 18) '-' (Num 1)) '-' (Var 8) ) 
  • sizechecking/SizedExp.hs

    r11 r12  
    1111import Constraints  
    1212import Data.Supply 
    13  
     13import Control.Arrow 
     14import Control.Monad 
    1415 
    1516class TS b => (Unify se a b)  where 
     
    1920 
    2021instance (SizedExp se, Unify se a b, se~se1, c1~c2, TS c2) => Unify se (Size se1 c1->a) (c2->b) where 
    21     unify f g x = f undefined x 
     22    unify f g = f undefined 
    2223 
    2324instance (SizedExp se, se~se1, c1~c2, TS c2) => Unify se (Size se1 c1) c2 where 
    24     unify f g x = g undefined x 
     25    unify f g = g undefined 
    2526 
    2627class SizedExp (se :: * -> *) where 
     
    7778    (s1, s2, s3) = split3 supply 
    7879    freshvars' :: (Unify Q a b) => (a -> (Size Q b, L -> L)) -> (Size Q c -> a) -> (Size Q (c -> b), L -> L) 
    79     freshvars' u exp = (QSynt $ sizeof $ x, \l -> f $ App l fv) 
     80    freshvars' u exp = (QSynt $ sizeof x, \l -> f $ App l fv) 
    8081        where 
    8182        (x, f) = u $ exp $ QSynt $ do  
    82             putStrLn $ "[Bind] var="++(show fv)++" of type "++(show $ tk q) 
     83            putStrLn $ "[Bind] var="++ show fv ++" of type "++ show (tk q) 
    8384            return [([], fv)] 
    8485        fv = fresh (tk q) s3 
    8586 
    8687addConstraint :: Constraint -> [SExp] -> [SExp] 
    87 addConstraint nc = map (\(c,l) -> (nc:c, l)) 
     88addConstraint nc = map (first ((:) nc)) 
    8889 
    8990concatMapM :: (a -> IO [b]) -> [a] -> IO [b] 
    90 concatMapM f l = mapM f l >>= return.concat 
     91concatMapM f l = liftM concat $ mapM f l 
    9192     
    9293type SExp = ([Constraint], L) 
     
    99100            match1 (cond, ltype) = do 
    100101                    x <- sizeof l 
    101                     putStrLn $ "ORIGINAL is " ++ (show x) 
    102                     putStrLn $ "[MATCH] ==> " ++ (show $ ltype) 
     102                    putStrLn $ "ORIGINAL is " ++ show x 
     103                    putStrLn $ "[MATCH] ==> " ++ show ltype 
    103104                    let lt = rall$  App (AAbs 18 5 $ Var 18) ltype 
    104                     putStrLn $ " --- NIL  ---" ++ (show lt) 
     105                    putStrLn $ " --- NIL  ---" ++ show lt 
    105106                    nils <- sizeof nil 
    106                     putStrLn $ show nils 
     107                    print nils 
    107108                    let nilc = foldr addConstraint nils $ Zero lt:cond 
    108109                    let tx = rall $ App (AAbs 18 5 $ App (Var 5) (Op (Var 18) '-' (Num 1))) ltype 
    109110                    let txs = rall $App (AAbs 18 5 $ List (Op (Var 18) '-' (Num 1)) (Var 5)) ltype 
    110                     putStrLn $ " --- CONS --- "++(show tx)++" <-> "++(show txs) 
     111                    putStrLn $ " --- CONS --- "++ show tx ++" <-> "++ show txs 
    111112                    conss <- sizeof $ cons (QSynt$return [([], tx)]) (QSynt$return [([], txs)]) 
    112113                    print conss 
     
    151152    fromInteger = num 
    152153 
    153 prove :: Size Q b -> IO (Bool) 
     154prove :: Size Q b -> IO Bool 
    154155prove (QProvable l x) = do 
    155     (s1,s2,s3) <- newSupply 30 (+1) >>= return.split3 
     156    (s1,s2,s3) <- liftM split3 $ newSupply 30 (+1) 
    156157    c <- x s1 
    157158    putStrLn "" 
Note: See TracChangeset for help on using the changeset viewer.