lazy-lambda-calculus: 4b3e729e7aa1f77400dca97eeb868a0d31043cb5
1: {-# Language FlexibleInstances #-}
2: {-# Language MultiParamTypeClasses #-}
3: {-# Language FlexibleContexts #-}
4: {-# Language ExistentialQuantification #-}
5:
6: module Data.Language.LC.Test where
7:
8: import Control.Monad.Partial
9: import Data.Nat
10: import Data.Data
11: import Data.Language.LC
12: import Data.Map
13: import Data.Maybe
14: import Data.Test
15: import Data.Typeable
16: import Test.LazySmallCheck2012 hiding (Nat, Term, Const)
17: import Test.LazySmallCheck2012.Core hiding (Term, C)
18:
19: -- Randomly generate terms
20: instance Serial a => Serial (Term a) where
21: series = cons1 Var \/
22: cons1 Lam \/
23: cons2 (:@)
24:
25: equalIn n x y = trueIn n (fmap (== C x) (eval y))
26: notDiffIn n x y = notFalseIn n (fmap (== C x) (eval y))
27:
28: lcTestMap :: Map String Test
29: lcTestMap = let i = (Lam 0 :: Term Nat) in
30: fromList [
31: ("evalCoterminates",
32: Test $ \x n -> let x' = evalN n (x :: Term Nat) in
33: closed x ==> isJust x' || isNothing x'),
34:
35: ("omegaDiverges",
36: Test $ \n -> isNothing (evalN n (omega :: Term ()))),
37:
38: ("eval$$",
39: Test $ \x -> trueIn 1 (fmap (== C x) (eval i >>= ($$ x)))),
40:
41: ("evalSteps",
42: Test $ \x -> equalIn 3 x (i :@ i :@ Const x)),
43:
44: ("id",
45: Test $ \x -> equalIn 2 x (i :@ Const x)),
46:
47: ("yTerminates",
48: Test $ \x -> equalIn 7 x ((yComb :: Term Nat) :@ Lam (Lam 0) :@ Const x)),
49:
50: ("zConst",
51: Test $ \x -> equalIn 5 x (zComb :@ Lam (Lam 0) :@ Const (x :: Int)))
52: ]
53:
54: testsRunner ts n = let next [] = return ()
55: next ((name, Test t):xs) = do print name
56: depthCheck n t
57: next xs in
58: next . toList $ ts
59:
60: testRunner ts n t = case Data.Map.lookup t ts of
61: Nothing -> error ("Could not find test " ++ t)
62: Just (Test x) -> depthCheck n x
63:
64: lcTests = testsRunner lcTestMap
65: lcTest = testRunner lcTestMap
66:
67: {-
68: plus Z y = y
69: plus (S x) y = S (plus x y)
70:
71: Z a b = a
72: (S x) a b = b (x a b)
73:
74: plus f Z y = Z y _
75: plus f (S x) y = (S x) _ (\x -> f x y)
76: plus f x y = x y (\n -> f n y)
77: \f (\x (\y ((x y) (\n ((f n) y)))))
78: \ (\ (\ ((1 0) (\ ((3 0) 1)))))
79:
80: plus = zComb :@ Lam (Lam (Lam (1 :@ 0 :@ (Lam (3 :@ 0 :@ 1)))))
81: testPlus x y = let sum = plus :@ church x :@ church y
82: result = force (2 * (x + y + 10)) (eval sum) in
83: result == Just (church (x + y))
84: -}
Generated by git2html.