90 lines
2.5 KiB
Idris
90 lines
2.5 KiB
Idris
|
module Parser.Tests
|
|||
|
|
|||
|
import Core.Term
|
|||
|
import Core.Check
|
|||
|
import Core.Convert
|
|||
|
import Core.Misc
|
|||
|
import Core.Normalize
|
|||
|
import Core.Value
|
|||
|
|
|||
|
import Control.Monad.RWS
|
|||
|
import Control.Monad.Identity
|
|||
|
import Control.Monad.Either
|
|||
|
|
|||
|
import Data.Fin
|
|||
|
|
|||
|
import Parser.Parse
|
|||
|
|
|||
|
%default total
|
|||
|
|
|||
|
convCheck : Term 0 -> Term 0 -> Either String (Bool, List String)
|
|||
|
convCheck a b = resolve action
|
|||
|
where
|
|||
|
action : PI Bool
|
|||
|
action = do
|
|||
|
x <- eval ctx0 a
|
|||
|
y <- eval ctx0 b
|
|||
|
convert x y
|
|||
|
|
|||
|
{- λA. λx. x : ∏ (A : Type) → A → A -}
|
|||
|
test_id : Either String (Bool, List String)
|
|||
|
test_id = do
|
|||
|
ty <- parse0 "Π ( A : Type ) A → A"
|
|||
|
tr <- parse0 "λA.λx.x"
|
|||
|
typecheck tr ty
|
|||
|
|
|||
|
{- λA. λB. λf. λx. f x : ∏ (A : Type) ∏ (B : A → Type) ∏ (f : ∏ (x : A) B x) ∏ (x : A) B x -}
|
|||
|
test_app : Either String (Bool, List String)
|
|||
|
test_app = do
|
|||
|
ty <- parse0 "Π (A : Type) Π (B : A → Type) Π (f : Π (x : A) B x) Π (x : A) B x"
|
|||
|
tr <- parse0 "λA. λB. λf. λx. f x"
|
|||
|
typecheck tr ty
|
|||
|
|
|||
|
{- λf. f ≃ λf. λx. f x -}
|
|||
|
eta_test : Either String (Bool, List String)
|
|||
|
eta_test = do
|
|||
|
a <- parse0 "λf. f"
|
|||
|
b <- parse0 "λf. λx. f x"
|
|||
|
convCheck a b
|
|||
|
|
|||
|
additionty_test : Either String (Bool, List String)
|
|||
|
additionty_test = do
|
|||
|
ty <- parse0 "ℕ → ℕ → ℕ"
|
|||
|
typecheck ty TType
|
|||
|
|
|||
|
addition_test : Either String (Bool, List String)
|
|||
|
addition_test = do
|
|||
|
ty <- parse0 "ℕ → ℕ → ℕ"
|
|||
|
tr <- parse0 "ℕ-ind (λ_. ℕ → ℕ) (λx.x) (λn.λnp.λm. suc (np m))"
|
|||
|
typecheck tr ty
|
|||
|
|
|||
|
-- no, not that kind
|
|||
|
unit_test : Either String (Bool, List String)
|
|||
|
unit_test = do
|
|||
|
ty <- parse0 "⊤"
|
|||
|
tr <- parse0 "★"
|
|||
|
typecheck tr ty
|
|||
|
|
|||
|
absurd_test : Either String (Bool, List String)
|
|||
|
absurd_test = do
|
|||
|
ty <- parse0 "Π(A : Type) ⊥ → A"
|
|||
|
tr <- parse0 "λA. ⊥-ind (λ_. A)"
|
|||
|
typecheck tr ty
|
|||
|
|
|||
|
|
|||
|
pr1_test : Either String (Bool, List String)
|
|||
|
pr1_test = do
|
|||
|
tr <- parse0 $ "let pr1 : Π (A : Type) Π (B : A → Type) (Σ (a : A) B a) → A"
|
|||
|
++ "≔ λA.λB. Σ-ind A B (λ_. A) (λa.λBa. a)"
|
|||
|
++ "in ★"
|
|||
|
typecheck tr TTop
|
|||
|
|
|||
|
pr1_pr2_test : Either String (Bool, List String)
|
|||
|
pr1_pr2_test = do
|
|||
|
tr <- parse0 $ "let pr1 : Π (A : Type) Π (B : A → Type) (Σ (a : A) B a) → A"
|
|||
|
++ "≔ λA.λB. Σ-ind A B (λ_. A) (λa.λBa. a)"
|
|||
|
++ "in let pr2 : Π (A : Type) Π (B : A → Type) Π (s : Σ (a : A) B a) B (pr1 A B s)"
|
|||
|
++ "≔ λA.λB. Σ-ind A B (λs. B (pr1 A B s)) (λa.λBa. Ba)"
|
|||
|
++ "in ★"
|
|||
|
typecheck tr TTop
|