diff options
| author | Arnaud Bailly <arnaud@pankzsoft.com> | 2025-10-27 16:26:55 +0100 |
|---|---|---|
| committer | Arnaud Bailly <arnaud@pankzsoft.com> | 2025-10-27 16:26:55 +0100 |
| commit | 46d94d86705a7fd0a7c5d0d7c6a74f11669641ca (patch) | |
| tree | a5739cde5488fccc77249f6d803efa6b460a1642 /lambda-calcul | |
| parent | 5cba53dd054222ce3319a1efe6803952c9675889 (diff) | |
| download | lambda-nantes-46d94d86705a7fd0a7c5d0d7c6a74f11669641ca.tar.gz | |
Add more tests and references
Diffstat (limited to 'lambda-calcul')
| -rw-r--r-- | lambda-calcul/README.md | 1 | ||||
| -rw-r--r-- | lambda-calcul/haskell/test/Minilang/IOSpec.hs | 4 | ||||
| -rw-r--r-- | lambda-calcul/haskell/test/Minilang/Lambda/EvalSpec.hs | 24 | ||||
| -rw-r--r-- | lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs | 3 |
4 files changed, 24 insertions, 8 deletions
diff --git a/lambda-calcul/README.md b/lambda-calcul/README.md index e24a326..c37f51d 100644 --- a/lambda-calcul/README.md +++ b/lambda-calcul/README.md @@ -1,2 +1,3 @@ * [on ruliology and λ-calcul](https://writings.stephenwolfram.com/2025/09/the-ruliology-of-lambdas/) * [typechecker zoo](https://www.stephendiehl.com/posts/typechecker_zoo/) +* [A tale of 4 lambdas](https://raw.githubusercontent.com/steshaw/lennart-lambda/master/top.pdf) diff --git a/lambda-calcul/haskell/test/Minilang/IOSpec.hs b/lambda-calcul/haskell/test/Minilang/IOSpec.hs index c4ae13e..14d279d 100644 --- a/lambda-calcul/haskell/test/Minilang/IOSpec.hs +++ b/lambda-calcul/haskell/test/Minilang/IOSpec.hs @@ -16,7 +16,7 @@ spec = parallel $ it "evaluates a simple MiniLang 'program' and dumps result" $ \fileName -> do let outputFileName = fileName <> ".out" program = - [ "((lam (x) x) y)" + [ "((lam (x y) x) z t)" ] writeFile fileName (unlines program) @@ -27,7 +27,7 @@ spec = parallel $ out <- readFile outputFileName - out `shouldBe` "Var \"y\"\n" + out `shouldBe` "Var \"z\"\n" withTempFile :: (String -> IO ()) -> IO () withTempFile = diff --git a/lambda-calcul/haskell/test/Minilang/Lambda/EvalSpec.hs b/lambda-calcul/haskell/test/Minilang/Lambda/EvalSpec.hs index df933a4..11cf394 100644 --- a/lambda-calcul/haskell/test/Minilang/Lambda/EvalSpec.hs +++ b/lambda-calcul/haskell/test/Minilang/Lambda/EvalSpec.hs @@ -7,9 +7,16 @@ import Test.Hspec (Spec, describe, it, shouldBe) spec :: Spec spec = do - let fix = Lam "x" (App (Var "x") (Var "x")) + let fix = + Lam + "f" + ( App + (Lam "x" (App (Var "f") (App (Var "x") (Var "x")))) + (Lam "x" (App (Var "f") (App (Var "x") (Var "x")))) + ) let omega = App fix fix let term = App (App (Lam "x" (Lam "y" (Var "y"))) omega) (Var "z") + let fst' = Lam "x" (Lam "y" (Var "x")) describe "call-by-value eval" $ do it "evaluates 'x' as itself" $ do @@ -18,12 +25,16 @@ spec = do it "evaluates '((λ x. x) y)' as 'y'" $ do let term = App (Lam "x" (Var "x")) (Var "y") eval term [] `shouldBe` Var "y" - it "evaluates '((λ x y. y) y z t)' as '(z t)'" $ do + it "evaluates '((λ x y. y) z t y)' as '(t y)'" $ do let snd' = Lam "x" (Lam "y" (Var "y")) - let term = App (App (App snd' (Var "y")) (Var "z")) (Var "t") - eval term [] `shouldBe` App (Var "z") (Var "t") + let term = App (App (App snd' (Var "z")) (Var "t")) (Var "y") + eval term [] `shouldBe` App (Var "t") (Var "y") + it "evaluates '((λ x y. x) z t)' as 'z'" $ do + let term = App (App fst' (Var "z")) (Var "t") + eval term [] `shouldBe` Var "z" it "diverges on evaluating argument bound to ω" $ - shouldDiverge $ eval term [] + shouldDiverge $ + eval term [] describe "call-by-need eval" $ do it "evaluates 'x' as itself" $ do @@ -31,7 +42,8 @@ spec = do it "evaluates '(λ x y . y) ⊥ z' as 'z'" $ do evalNeed term [] `shouldBe` Var "z" it "diverges on evaluating ω" $ - shouldDiverge $ evalNeed omega [] + shouldDiverge $ + evalNeed omega [] shouldDiverge :: Term -> IO () shouldDiverge t = diff --git a/lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs b/lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs index d4c90bd..5d3e8ab 100644 --- a/lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs +++ b/lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs @@ -13,6 +13,9 @@ import Test.Hspec (Spec, parallel, shouldBe) import Test.Hspec.QuickCheck (prop) import Test.QuickCheck (Arbitrary (..), Gen, NonEmptyList (..), counterexample, elements, forAll, forAllShrink, listOf, oneof, resize, sized, (===), (==>)) +-- ((f x) y) --> (f x y) +-- (lam (x) (lam (y) y)) --> (lam (x y) y) + spec :: Spec spec = parallel $ do prop "parses an identifier as a variable" $ \(Identifier ident) -> |
