more tests and minor cleanup

This commit is contained in:
William Ball 2024-11-14 19:56:33 -08:00
parent f9e70ca131
commit 3715773adc
6 changed files with 83 additions and 23 deletions

View file

@ -1,6 +1,6 @@
module Check where module Check (TypeCheckError (..), CheckResult (..), findType) where
import Control.Monad.Except import Control.Monad.Except ( MonadError(throwError) )
import Data.List (intercalate, (!?)) import Data.List (intercalate, (!?))
import Control.Monad (unless) import Control.Monad (unless)

View file

@ -22,16 +22,6 @@ instance Eq Expr where
(Pi _ t1 b1) == (Pi _ t2 b2) = t1 == t2 && b1 == b2 (Pi _ t1 b1) == (Pi _ t2 b2) = t1 == t2 && b1 == b2
_ == _ = False _ == _ = False
infixl 4 <.>
(<.>) :: Expr -> Expr -> Expr
(<.>) = App
infixr 2 .->
(.->) :: Expr -> Expr -> Expr
a .-> b = Pi "" a (incIndices b)
occursFree :: Integer -> Expr -> Bool occursFree :: Integer -> Expr -> Bool
occursFree n (Var k _) = n == k occursFree n (Var k _) = n == k
occursFree _ Star = False occursFree _ Star = False

View file

@ -1,4 +1,4 @@
module Parser where module Parser (pAll) where
import Control.Monad import Control.Monad
import Control.Monad.State.Strict import Control.Monad.State.Strict
@ -7,7 +7,7 @@ import Data.Functor.Identity
import Data.List (elemIndex) import Data.List (elemIndex)
import Data.List.NonEmpty (NonEmpty ((:|))) import Data.List.NonEmpty (NonEmpty ((:|)))
import qualified Data.List.NonEmpty as NE import qualified Data.List.NonEmpty as NE
import Expr (Expr (..), incIndices, (.->)) import Expr (Expr (..), incIndices)
import Text.Megaparsec hiding (State) import Text.Megaparsec hiding (State)
import Text.Megaparsec.Char import Text.Megaparsec.Char
import qualified Text.Megaparsec.Char.Lexer as L import qualified Text.Megaparsec.Char.Lexer as L
@ -84,8 +84,7 @@ pArrow :: Parser Expr
pArrow = lexeme $ label "->" $ do pArrow = lexeme $ label "->" $ do
a <- pAppTerm a <- pAppTerm
_ <- defChoice $ "->" :| [""] _ <- defChoice $ "->" :| [""]
b <- pExpr Pi "" a . incIndices <$> pExpr
pure $ a .-> b
pApp :: Parser Expr pApp :: Parser Expr
pApp = foldl1 App <$> some pTerm pApp = foldl1 App <$> some pTerm

View file

@ -1,10 +1,10 @@
module ExprTests where module ExprTests (tests) where
import Expr import Expr
import Test.HUnit import Test.HUnit
inner :: Expr inner :: Expr
inner = Abs "x" (Var 0 "A") $ Var 2 "f" <.> Var 0 "x" inner = Abs "x" (Var 0 "A") $ App (Var 2 "f") (Var 0 "x")
e1 :: Expr e1 :: Expr
e1 = Abs "A" Star inner e1 = Abs "A" Star inner
@ -19,12 +19,12 @@ incE1 =
"incIndices e1" "incIndices e1"
( Abs "A" Star $ ( Abs "A" Star $
Abs "x" (Var 0 "A") $ Abs "x" (Var 0 "A") $
Var 3 "f" <.> Var 0 "x" App (Var 3 "f") (Var 0 "x")
) )
(incIndices e1) (incIndices e1)
after :: Expr after :: Expr
after = Abs "x" (Var 2 "B") $ Var 1 "f" <.> Var 0 "x" after = Abs "x" (Var 2 "B") $ App (Var 1 "f") (Var 0 "x")
substE1 :: Test substE1 :: Test
substE1 = substE1 =
@ -40,7 +40,7 @@ betaNFe1 =
assertEqual assertEqual
"e1 B" "e1 B"
after after
(betaNF $ e1 <.> Var 2 "B") (betaNF $ App e1 $ Var 2 "B")
tests :: Test tests :: Test
tests = tests =

View file

@ -1 +1,70 @@
module ParserTests where module ParserTests (tests) where
import Expr (Expr (..))
import Parser (pAll)
import Test.HUnit
ident :: Expr
ident =
Abs "A" Star $
Abs "x" (Var 0 "A") $
Var 0 "x"
ident1 :: Test
ident1 =
TestCase $
assertEqual
"ident 1"
(Right ident)
(pAll "lambda (A : *) . lambda (x : A) . x")
ident2 :: Test
ident2 =
TestCase $
assertEqual
"ident 2"
(Right ident)
(pAll "fun (A : *) (x : A) => x")
double :: Expr
double =
Abs "A" Star $
Abs "B" Star $
Abs "f" (Pi "" (Var 1 "A") (Var 1 "B")) $
Abs "g" (Pi "" (Var 2 "A") (Var 2 "B")) $
Abs "x" (Var 3 "A") $
App (Var 2 "f") (Var 0 "x")
doubleTest :: Test
doubleTest =
TestCase $
assertEqual
"double"
(Right double)
(pAll "fun (A B : *) (f g : A -> B) (x : A) => f x")
theorem :: Expr
theorem =
Abs "S" Star $
Abs "P" (Pi "" (Var 0 "S") Star) $
Abs "Q" (Pi "" (Var 1 "S") Star) $
Abs "HP" (Pi "x" (Var 2 "S") (App (Var 2 "P") (Var 0 "x"))) $
Abs "H" (Pi "x" (Var 3 "S") (Pi "" (App (Var 3 "P") (Var 0 "x")) (App (Var 3 "Q") (Var 1 "x")))) $
Abs "x" (Var 4 "S") (App (App (Var 1 "H") (Var 0 "x")) (App (Var 2 "HP") (Var 0 "x")))
theoremTest :: Test
theoremTest =
TestCase $
assertEqual
"theorem"
(Right theorem)
(pAll "fun (S : *) (P Q : S -> *) (HP : ∏ (x : S) . P x) (H : forall (x : S), P x -> Q x) (x : S) => H x (HP x)")
tests :: Test
tests =
TestList
[ TestLabel "ident1" ident1
, TestLabel "ident2" ident2
, TestLabel "double" doubleTest
, TestLabel "theorem" theoremTest
]

View file

@ -1,11 +1,13 @@
module Main where module Main where
import qualified ExprTests as E import qualified ExprTests as E
import qualified ParserTests as P
import qualified System.Exit as Exit import qualified System.Exit as Exit
import Test.HUnit import Test.HUnit
tests :: Test tests :: Test
tests = TestList [TestLabel "ExprTests" E.tests] tests = TestList [ TestLabel "ExprTests" E.tests
, TestLabel "ParserTests" P.tests]
main :: IO () main :: IO ()
main = do main = do