crude but effective stratification
This commit is contained in:
parent
e4a20cc632
commit
42aa07c9c8
31 changed files with 817 additions and 582 deletions
|
@ -12,12 +12,12 @@ defGlobals : Definitions
|
|||
defGlobals = fromList
|
||||
[("A", ^mkPostulate gzero (^TYPE 0)),
|
||||
("B", ^mkPostulate gzero (^TYPE 0)),
|
||||
("a", ^mkPostulate gany (^FT "A")),
|
||||
("a'", ^mkPostulate gany (^FT "A")),
|
||||
("b", ^mkPostulate gany (^FT "B")),
|
||||
("f", ^mkPostulate gany (^Arr One (^FT "A") (^FT "A"))),
|
||||
("id", ^mkDef gany (^Arr One (^FT "A") (^FT "A")) (^LamY "x" (^BVT 0))),
|
||||
("eq-AB", ^mkPostulate gzero (^Eq0 (^TYPE 0) (^FT "A") (^FT "B"))),
|
||||
("a", ^mkPostulate gany (^FT "A" 0)),
|
||||
("a'", ^mkPostulate gany (^FT "A" 0)),
|
||||
("b", ^mkPostulate gany (^FT "B" 0)),
|
||||
("f", ^mkPostulate gany (^Arr One (^FT "A" 0) (^FT "A" 0))),
|
||||
("id", ^mkDef gany (^Arr One (^FT "A" 0) (^FT "A" 0)) (^LamY "x" (^BVT 0))),
|
||||
("eq-AB", ^mkPostulate gzero (^Eq0 (^TYPE 0) (^FT "A" 0) (^FT "B" 0))),
|
||||
("two", ^mkDef gany (^Nat) (^Succ (^Succ (^Zero))))]
|
||||
|
||||
parameters (label : String) (act : Equal ())
|
||||
|
@ -87,10 +87,10 @@ tests = "equality & subtyping" :- [
|
|||
tm2 = ^Arr One (^TYPE 0) (^TYPE 1) in
|
||||
subT empty (^TYPE 2) tm1 tm2,
|
||||
testEq "1.A → B = 1.A → B" $
|
||||
let tm = ^Arr One (^FT "A") (^FT "B") in
|
||||
let tm = ^Arr One (^FT "A" 0) (^FT "B" 0) in
|
||||
equalT empty (^TYPE 0) tm tm,
|
||||
testEq "1.A → B <: 1.A → B" $
|
||||
let tm = ^Arr One (^FT "A") (^FT "B") in
|
||||
let tm = ^Arr One (^FT "A" 0) (^FT "B" 0) in
|
||||
subT empty (^TYPE 0) tm tm,
|
||||
note "incompatible quantities",
|
||||
testNeq "1.★₀ → ★₀ ≠ 0.★₀ → ★₁" $
|
||||
|
@ -98,52 +98,52 @@ tests = "equality & subtyping" :- [
|
|||
tm2 = ^Arr Zero (^TYPE 0) (^TYPE 1) in
|
||||
equalT empty (^TYPE 2) tm1 tm2,
|
||||
testNeq "0.A → B ≠ 1.A → B" $
|
||||
let tm1 = ^Arr Zero (^FT "A") (^FT "B")
|
||||
tm2 = ^Arr One (^FT "A") (^FT "B") in
|
||||
let tm1 = ^Arr Zero (^FT "A" 0) (^FT "B" 0)
|
||||
tm2 = ^Arr One (^FT "A" 0) (^FT "B" 0) in
|
||||
equalT empty (^TYPE 0) tm1 tm2,
|
||||
testNeq "0.A → B ≮: 1.A → B" $
|
||||
let tm1 = ^Arr Zero (^FT "A") (^FT "B")
|
||||
tm2 = ^Arr One (^FT "A") (^FT "B") in
|
||||
let tm1 = ^Arr Zero (^FT "A" 0) (^FT "B" 0)
|
||||
tm2 = ^Arr One (^FT "A" 0) (^FT "B" 0) in
|
||||
subT empty (^TYPE 0) tm1 tm2,
|
||||
testEq "0=1 ⊢ 0.A → B = 1.A → B" $
|
||||
let tm1 = ^Arr Zero (^FT "A") (^FT "B")
|
||||
tm2 = ^Arr One (^FT "A") (^FT "B") in
|
||||
let tm1 = ^Arr Zero (^FT "A" 0) (^FT "B" 0)
|
||||
tm2 = ^Arr One (^FT "A" 0) (^FT "B" 0) in
|
||||
equalT empty01 (^TYPE 0) tm1 tm2,
|
||||
todo "dependent function types"
|
||||
],
|
||||
|
||||
"lambda" :- [
|
||||
testEq "λ x ⇒ x = λ x ⇒ x" $
|
||||
equalT empty (^Arr One (^FT "A") (^FT "A"))
|
||||
equalT empty (^Arr One (^FT "A" 0) (^FT "A" 0))
|
||||
(^LamY "x" (^BVT 0))
|
||||
(^LamY "x" (^BVT 0)),
|
||||
testEq "λ x ⇒ x <: λ x ⇒ x" $
|
||||
subT empty (^Arr One (^FT "A") (^FT "A"))
|
||||
subT empty (^Arr One (^FT "A" 0) (^FT "A" 0))
|
||||
(^LamY "x" (^BVT 0))
|
||||
(^LamY "x" (^BVT 0)),
|
||||
testEq "λ x ⇒ x = λ y ⇒ y" $
|
||||
equalT empty (^Arr One (^FT "A") (^FT "A"))
|
||||
equalT empty (^Arr One (^FT "A" 0) (^FT "A" 0))
|
||||
(^LamY "x" (^BVT 0))
|
||||
(^LamY "y" (^BVT 0)),
|
||||
testEq "λ x ⇒ x <: λ y ⇒ y" $
|
||||
subT empty (^Arr One (^FT "A") (^FT "A"))
|
||||
subT empty (^Arr One (^FT "A" 0) (^FT "A" 0))
|
||||
(^LamY "x" (^BVT 0))
|
||||
(^LamY "y" (^BVT 0)),
|
||||
testNeq "λ x y ⇒ x ≠ λ x y ⇒ y" $
|
||||
equalT empty
|
||||
(^Arr One (^FT "A") (^Arr One (^FT "A") (^FT "A")))
|
||||
(^Arr One (^FT "A" 0) (^Arr One (^FT "A" 0) (^FT "A" 0)))
|
||||
(^LamY "x" (^LamY "y" (^BVT 1)))
|
||||
(^LamY "x" (^LamY "y" (^BVT 0))),
|
||||
testEq "λ x ⇒ a = λ x ⇒ a (Y vs N)" $
|
||||
equalT empty
|
||||
(^Arr Zero (^FT "B") (^FT "A"))
|
||||
(^LamY "x" (^FT "a"))
|
||||
(^LamN (^FT "a")),
|
||||
(^Arr Zero (^FT "B" 0) (^FT "A" 0))
|
||||
(^LamY "x" (^FT "a" 0))
|
||||
(^LamN (^FT "a" 0)),
|
||||
testEq "λ x ⇒ f x = f (η)" $
|
||||
equalT empty
|
||||
(^Arr One (^FT "A") (^FT "A"))
|
||||
(^LamY "x" (E $ ^App (^F "f") (^BVT 0)))
|
||||
(^FT "f")
|
||||
(^Arr One (^FT "A" 0) (^FT "A" 0))
|
||||
(^LamY "x" (E $ ^App (^F "f" 0) (^BVT 0)))
|
||||
(^FT "f" 0)
|
||||
],
|
||||
|
||||
"eq type" :- [
|
||||
|
@ -154,7 +154,7 @@ tests = "equality & subtyping" :- [
|
|||
{globals = fromList [("A", ^mkDef gzero (^TYPE 2) (^TYPE 1))]} $
|
||||
equalT empty (^TYPE 2)
|
||||
(^Eq0 (^TYPE 1) (^TYPE 0) (^TYPE 0))
|
||||
(^Eq0 (^FT "A") (^TYPE 0) (^TYPE 0)),
|
||||
(^Eq0 (^FT "A" 0) (^TYPE 0) (^TYPE 0)),
|
||||
todo "dependent equality types"
|
||||
],
|
||||
|
||||
|
@ -166,94 +166,100 @@ tests = "equality & subtyping" :- [
|
|||
note "binds before ∥ are globals, after it are BVs",
|
||||
note #"refl A x is an abbreviation for "(δ i ⇒ x) ∷ (x ≡ x : A)""#,
|
||||
testEq "refl A a = refl A a" $
|
||||
equalE empty (refl (^FT "A") (^FT "a")) (refl (^FT "A") (^FT "a")),
|
||||
equalE empty
|
||||
(refl (^FT "A" 0) (^FT "a" 0))
|
||||
(refl (^FT "A" 0) (^FT "a" 0)),
|
||||
|
||||
testEq "p : (a ≡ a' : A), q : (a ≡ a' : A) ∥ ⊢ p = q (free)"
|
||||
{globals =
|
||||
let def = ^mkPostulate gzero (^Eq0 (^FT "A") (^FT "a") (^FT "a'"))
|
||||
let def = ^mkPostulate gzero
|
||||
(^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a'" 0))
|
||||
in defGlobals `mergeLeft` fromList [("p", def), ("q", def)]} $
|
||||
equalE empty (^F "p") (^F "q"),
|
||||
equalE empty (^F "p" 0) (^F "q" 0),
|
||||
|
||||
testEq "∥ x : (a ≡ a' : A), y : (a ≡ a' : A) ⊢ x = y (bound)" $
|
||||
let ty : forall n. Term 0 n := ^Eq0 (^FT "A") (^FT "a") (^FT "a'") in
|
||||
let ty : forall n. Term 0 n :=
|
||||
^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a'" 0) in
|
||||
equalE (extendTyN [< (Any, "x", ty), (Any, "y", ty)] empty)
|
||||
(^BV 0) (^BV 1),
|
||||
|
||||
testEq "∥ x : (a ≡ a' : A) ∷ Type 0, y : [ditto] ⊢ x = y" $
|
||||
let ty : forall n. Term 0 n :=
|
||||
E $ ^Ann (^Eq0 (^FT "A") (^FT "a") (^FT "a'")) (^TYPE 0) in
|
||||
E $ ^Ann (^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a'" 0)) (^TYPE 0) in
|
||||
equalE (extendTyN [< (Any, "x", ty), (Any, "y", ty)] empty)
|
||||
(^BV 0) (^BV 1),
|
||||
|
||||
testEq "E ≔ a ≡ a' : A, EE ≔ E ∥ x : EE, y : EE ⊢ x = y"
|
||||
{globals = defGlobals `mergeLeft` fromList
|
||||
[("E", ^mkDef gzero (^TYPE 0)
|
||||
(^Eq0 (^FT "A") (^FT "a") (^FT "a'"))),
|
||||
("EE", ^mkDef gzero (^TYPE 0) (^FT "E"))]} $
|
||||
equalE (extendTyN [< (Any, "x", ^FT "EE"), (Any, "y", ^FT "EE")] empty)
|
||||
(^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a'" 0))),
|
||||
("EE", ^mkDef gzero (^TYPE 0) (^FT "E" 0))]} $
|
||||
equalE
|
||||
(extendTyN [< (Any, "x", ^FT "EE" 0), (Any, "y", ^FT "EE" 0)] empty)
|
||||
(^BV 0) (^BV 1),
|
||||
|
||||
testEq "E ≔ a ≡ a' : A, EE ≔ E ∥ x : EE, y : E ⊢ x = y"
|
||||
{globals = defGlobals `mergeLeft` fromList
|
||||
[("E", ^mkDef gzero (^TYPE 0)
|
||||
(^Eq0 (^FT "A") (^FT "a") (^FT "a'"))),
|
||||
("EE", ^mkDef gzero (^TYPE 0) (^FT "E"))]} $
|
||||
equalE (extendTyN [< (Any, "x", ^FT "EE"), (Any, "y", ^FT "E")] empty)
|
||||
(^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a'" 0))),
|
||||
("EE", ^mkDef gzero (^TYPE 0) (^FT "E" 0))]} $
|
||||
equalE
|
||||
(extendTyN [< (Any, "x", ^FT "EE" 0), (Any, "y", ^FT "E" 0)] empty)
|
||||
(^BV 0) (^BV 1),
|
||||
|
||||
testEq "E ≔ a ≡ a' : A ∥ x : E, y : E ⊢ x = y"
|
||||
{globals = defGlobals `mergeLeft` fromList
|
||||
[("E", ^mkDef gzero (^TYPE 0)
|
||||
(^Eq0 (^FT "A") (^FT "a") (^FT "a'")))]} $
|
||||
equalE (extendTyN [< (Any, "x", ^FT "E"), (Any, "y", ^FT "E")] empty)
|
||||
(^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a'" 0)))]} $
|
||||
equalE (extendTyN [< (Any, "x", ^FT "E" 0), (Any, "y", ^FT "E" 0)] empty)
|
||||
(^BV 0) (^BV 1),
|
||||
|
||||
testEq "E ≔ a ≡ a' : A ∥ x : (E×E), y : (E×E) ⊢ x = y"
|
||||
{globals = defGlobals `mergeLeft` fromList
|
||||
[("E", ^mkDef gzero (^TYPE 0)
|
||||
(^Eq0 (^FT "A") (^FT "a") (^FT "a'")))]} $
|
||||
let ty : forall n. Term 0 n := ^Sig (^FT "E") (SN $ ^FT "E") in
|
||||
(^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a'" 0)))]} $
|
||||
let ty : forall n. Term 0 n := ^Sig (^FT "E" 0) (SN $ ^FT "E" 0) in
|
||||
equalE (extendTyN [< (Any, "x", ty), (Any, "y", ty)] empty)
|
||||
(^BV 0) (^BV 1),
|
||||
|
||||
testEq "E ≔ a ≡ a' : A, W ≔ E × E ∥ x : W, y : E×E ⊢ x = y"
|
||||
{globals = defGlobals `mergeLeft` fromList
|
||||
[("E", ^mkDef gzero (^TYPE 0)
|
||||
(^Eq0 (^FT "A") (^FT "a") (^FT "a'"))),
|
||||
("W", ^mkDef gzero (^TYPE 0) (^And (^FT "E") (^FT "E")))]} $
|
||||
(^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a'" 0))),
|
||||
("W", ^mkDef gzero (^TYPE 0) (^And (^FT "E" 0) (^FT "E" 0)))]} $
|
||||
equalE
|
||||
(extendTyN [< (Any, "x", ^FT "W"),
|
||||
(Any, "y", ^And (^FT "E") (^FT "E"))] empty)
|
||||
(extendTyN [< (Any, "x", ^FT "W" 0),
|
||||
(Any, "y", ^And (^FT "E" 0) (^FT "E" 0))] empty)
|
||||
(^BV 0) (^BV 1)
|
||||
],
|
||||
|
||||
"term closure" :- [
|
||||
note "bold numbers for de bruijn indices",
|
||||
testEq "𝟎{} = 𝟎 : A" $
|
||||
equalT (extendTy Any "x" (^FT "A") empty)
|
||||
(^FT "A")
|
||||
equalT (extendTy Any "x" (^FT "A" 0) empty)
|
||||
(^FT "A" 0)
|
||||
(CloT (Sub (^BVT 0) id))
|
||||
(^BVT 0),
|
||||
testEq "𝟎{a} = a : A" $
|
||||
equalT empty (^FT "A")
|
||||
(CloT (Sub (^BVT 0) (^F "a" ::: id)))
|
||||
(^FT "a"),
|
||||
equalT empty (^FT "A" 0)
|
||||
(CloT (Sub (^BVT 0) (^F "a" 0 ::: id)))
|
||||
(^FT "a" 0),
|
||||
testEq "𝟎{a,b} = a : A" $
|
||||
equalT empty (^FT "A")
|
||||
(CloT (Sub (^BVT 0) (^F "a" ::: ^F "b" ::: id)))
|
||||
(^FT "a"),
|
||||
equalT empty (^FT "A" 0)
|
||||
(CloT (Sub (^BVT 0) (^F "a" 0 ::: ^F "b" 0 ::: id)))
|
||||
(^FT "a" 0),
|
||||
testEq "𝟏{a,b} = b : A" $
|
||||
equalT empty (^FT "A")
|
||||
(CloT (Sub (^BVT 1) (^F "a" ::: ^F "b" ::: id)))
|
||||
(^FT "b"),
|
||||
equalT empty (^FT "A" 0)
|
||||
(CloT (Sub (^BVT 1) (^F "a" 0 ::: ^F "b" 0 ::: id)))
|
||||
(^FT "b" 0),
|
||||
testEq "(λy ⇒ 𝟏){a} = λy ⇒ a : 0.B → A (N)" $
|
||||
equalT empty (^Arr Zero (^FT "B") (^FT "A"))
|
||||
(CloT (Sub (^LamN (^BVT 0)) (^F "a" ::: id)))
|
||||
(^LamN (^FT "a")),
|
||||
equalT empty (^Arr Zero (^FT "B" 0) (^FT "A" 0))
|
||||
(CloT (Sub (^LamN (^BVT 0)) (^F "a" 0 ::: id)))
|
||||
(^LamN (^FT "a" 0)),
|
||||
testEq "(λy ⇒ 𝟏){a} = λy ⇒ a : 0.B → A (Y)" $
|
||||
equalT empty (^Arr Zero (^FT "B") (^FT "A"))
|
||||
(CloT (Sub (^LamY "y" (^BVT 1)) (^F "a" ::: id)))
|
||||
(^LamY "y" (^FT "a"))
|
||||
equalT empty (^Arr Zero (^FT "B" 0) (^FT "A" 0))
|
||||
(CloT (Sub (^LamY "y" (^BVT 1)) (^F "a" 0 ::: id)))
|
||||
(^LamY "y" (^FT "a" 0))
|
||||
],
|
||||
|
||||
"term d-closure" :- [
|
||||
|
@ -262,9 +268,9 @@ tests = "equality & subtyping" :- [
|
|||
(^TYPE 1) (DCloT (Sub (^TYPE 0) (^K Zero ::: id))) (^TYPE 0),
|
||||
testEq "(δ i ⇒ a)‹0› = (δ i ⇒ a) : (a ≡ a : A)" $
|
||||
equalT (extendDim "𝑗" empty)
|
||||
(^Eq0 (^FT "A") (^FT "a") (^FT "a"))
|
||||
(DCloT (Sub (^DLamN (^FT "a")) (^K Zero ::: id)))
|
||||
(^DLamN (^FT "a")),
|
||||
(^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a" 0))
|
||||
(DCloT (Sub (^DLamN (^FT "a" 0)) (^K Zero ::: id)))
|
||||
(^DLamN (^FT "a" 0)),
|
||||
note "it is hard to think of well-typed terms with big dctxs"
|
||||
],
|
||||
|
||||
|
@ -274,37 +280,37 @@ tests = "equality & subtyping" :- [
|
|||
("B", ^mkDef gany (^TYPE 1) (^TYPE 0))]
|
||||
au_ba = fromList
|
||||
[("A", ^mkDef gany (^TYPE 1) (^TYPE 0)),
|
||||
("B", ^mkDef gany (^TYPE 1) (^FT "A"))]
|
||||
("B", ^mkDef gany (^TYPE 1) (^FT "A" 0))]
|
||||
in [
|
||||
testEq "A = A" $
|
||||
equalE empty (^F "A") (^F "A"),
|
||||
equalE empty (^F "A" 0) (^F "A" 0),
|
||||
testNeq "A ≠ B" $
|
||||
equalE empty (^F "A") (^F "B"),
|
||||
equalE empty (^F "A" 0) (^F "B" 0),
|
||||
testEq "0=1 ⊢ A = B" $
|
||||
equalE empty01 (^F "A") (^F "B"),
|
||||
equalE empty01 (^F "A" 0) (^F "B" 0),
|
||||
testEq "A : ★₁ ≔ ★₀ ⊢ A = (★₀ ∷ ★₁)" {globals = au_bu} $
|
||||
equalE empty (^F "A") (^Ann (^TYPE 0) (^TYPE 1)),
|
||||
equalE empty (^F "A" 0) (^Ann (^TYPE 0) (^TYPE 1)),
|
||||
testEq "A : ★₁ ≔ ★₀ ⊢ A = ★₀" {globals = au_bu} $
|
||||
equalT empty (^TYPE 1) (^FT "A") (^TYPE 0),
|
||||
equalT empty (^TYPE 1) (^FT "A" 0) (^TYPE 0),
|
||||
testEq "A ≔ ★₀, B ≔ ★₀ ⊢ A = B" {globals = au_bu} $
|
||||
equalE empty (^F "A") (^F "B"),
|
||||
equalE empty (^F "A" 0) (^F "B" 0),
|
||||
testEq "A ≔ ★₀, B ≔ A ⊢ A = B" {globals = au_ba} $
|
||||
equalE empty (^F "A") (^F "B"),
|
||||
equalE empty (^F "A" 0) (^F "B" 0),
|
||||
testEq "A <: A" $
|
||||
subE empty (^F "A") (^F "A"),
|
||||
subE empty (^F "A" 0) (^F "A" 0),
|
||||
testNeq "A ≮: B" $
|
||||
subE empty (^F "A") (^F "B"),
|
||||
subE empty (^F "A" 0) (^F "B" 0),
|
||||
testEq "A : ★₃ ≔ ★₀, B : ★₃ ≔ ★₂ ⊢ A <: B"
|
||||
{globals = fromList [("A", ^mkDef gany (^TYPE 3) (^TYPE 0)),
|
||||
("B", ^mkDef gany (^TYPE 3) (^TYPE 2))]} $
|
||||
subE empty (^F "A") (^F "B"),
|
||||
subE empty (^F "A" 0) (^F "B" 0),
|
||||
note "(A and B in different universes)",
|
||||
testEq "A : ★₁ ≔ ★₀, B : ★₃ ≔ ★₂ ⊢ A <: B"
|
||||
{globals = fromList [("A", ^mkDef gany (^TYPE 1) (^TYPE 0)),
|
||||
("B", ^mkDef gany (^TYPE 3) (^TYPE 2))]} $
|
||||
subE empty (^F "A") (^F "B"),
|
||||
subE empty (^F "A" 0) (^F "B" 0),
|
||||
testEq "0=1 ⊢ A <: B" $
|
||||
subE empty01 (^F "A") (^F "B")
|
||||
subE empty01 (^F "A" 0) (^F "B" 0)
|
||||
],
|
||||
|
||||
"bound var" :- [
|
||||
|
@ -326,110 +332,115 @@ tests = "equality & subtyping" :- [
|
|||
|
||||
"application" :- [
|
||||
testEq "f a = f a" $
|
||||
equalE empty (^App (^F "f") (^FT "a")) (^App (^F "f") (^FT "a")),
|
||||
equalE empty (^App (^F "f" 0) (^FT "a" 0)) (^App (^F "f" 0) (^FT "a" 0)),
|
||||
testEq "f a <: f a" $
|
||||
subE empty (^App (^F "f") (^FT "a")) (^App (^F "f") (^FT "a")),
|
||||
subE empty (^App (^F "f" 0) (^FT "a" 0)) (^App (^F "f" 0) (^FT "a" 0)),
|
||||
testEq "(λ x ⇒ x ∷ 1.A → A) a = ((a ∷ A) ∷ A) (β)" $
|
||||
equalE empty
|
||||
(^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A") (^FT "A")))
|
||||
(^FT "a"))
|
||||
(^Ann (E $ ^Ann (^FT "a") (^FT "A")) (^FT "A")),
|
||||
(^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A" 0) (^FT "A" 0)))
|
||||
(^FT "a" 0))
|
||||
(^Ann (E $ ^Ann (^FT "a" 0) (^FT "A" 0)) (^FT "A" 0)),
|
||||
testEq "(λ x ⇒ x ∷ A ⊸ A) a = a (βυ)" $
|
||||
equalE empty
|
||||
(^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A") (^FT "A")))
|
||||
(^FT "a"))
|
||||
(^F "a"),
|
||||
(^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A" 0) (^FT "A" 0)))
|
||||
(^FT "a" 0))
|
||||
(^F "a" 0),
|
||||
testEq "((λ g ⇒ g a) ∷ 1.(1.A → A) → A) f = ((λ y ⇒ f y) ∷ 1.A → A) a # β↘↙" $
|
||||
let a = ^FT "A"; a2a = ^Arr One a a; aa2a = ^Arr One a2a a in
|
||||
let a = ^FT "A" 0; a2a = ^Arr One a a; aa2a = ^Arr One a2a a in
|
||||
equalE empty
|
||||
(^App (^Ann (^LamY "g" (E $ ^App (^BV 0) (^FT "a"))) aa2a) (^FT "f"))
|
||||
(^App (^Ann (^LamY "y" (E $ ^App (^F "f") (^BVT 0))) a2a) (^FT "a")),
|
||||
(^App (^Ann (^LamY "g" (E $ ^App (^BV 0) (^FT "a" 0))) aa2a)
|
||||
(^FT "f" 0))
|
||||
(^App (^Ann (^LamY "y" (E $ ^App (^F "f" 0) (^BVT 0))) a2a)
|
||||
(^FT "a" 0)),
|
||||
testEq "((λ x ⇒ x) ∷ 1.A → A) a <: a" $
|
||||
subE empty
|
||||
(^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A") (^FT "A")))
|
||||
(^FT "a"))
|
||||
(^F "a"),
|
||||
(^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A" 0) (^FT "A" 0)))
|
||||
(^FT "a" 0))
|
||||
(^F "a" 0),
|
||||
note "id : A ⊸ A ≔ λ x ⇒ x",
|
||||
testEq "id a = a" $ equalE empty (^App (^F "id") (^FT "a")) (^F "a"),
|
||||
testEq "id a <: a" $ subE empty (^App (^F "id") (^FT "a")) (^F "a")
|
||||
testEq "id a = a" $ equalE empty (^App (^F "id" 0) (^FT "a" 0)) (^F "a" 0),
|
||||
testEq "id a <: a" $ subE empty (^App (^F "id" 0) (^FT "a" 0)) (^F "a" 0)
|
||||
],
|
||||
|
||||
"dim application" :- [
|
||||
testEq "eq-AB @0 = eq-AB @0" $
|
||||
equalE empty
|
||||
(^DApp (^F "eq-AB") (^K Zero))
|
||||
(^DApp (^F "eq-AB") (^K Zero)),
|
||||
(^DApp (^F "eq-AB" 0) (^K Zero))
|
||||
(^DApp (^F "eq-AB" 0) (^K Zero)),
|
||||
testNeq "eq-AB @0 ≠ eq-AB @1" $
|
||||
equalE empty
|
||||
(^DApp (^F "eq-AB") (^K Zero))
|
||||
(^DApp (^F "eq-AB") (^K One)),
|
||||
(^DApp (^F "eq-AB" 0) (^K Zero))
|
||||
(^DApp (^F "eq-AB" 0) (^K One)),
|
||||
testEq "𝑖 | ⊢ eq-AB @𝑖 = eq-AB @𝑖" $
|
||||
equalE
|
||||
(extendDim "𝑖" empty)
|
||||
(^DApp (^F "eq-AB") (^BV 0))
|
||||
(^DApp (^F "eq-AB") (^BV 0)),
|
||||
(^DApp (^F "eq-AB" 0) (^BV 0))
|
||||
(^DApp (^F "eq-AB" 0) (^BV 0)),
|
||||
testNeq "𝑖 | ⊢ eq-AB @𝑖 ≠ eq-AB @0" $
|
||||
equalE (extendDim "𝑖" empty)
|
||||
(^DApp (^F "eq-AB") (^BV 0))
|
||||
(^DApp (^F "eq-AB") (^K Zero)),
|
||||
(^DApp (^F "eq-AB" 0) (^BV 0))
|
||||
(^DApp (^F "eq-AB" 0) (^K Zero)),
|
||||
testEq "𝑖, 𝑖=0 | ⊢ eq-AB @𝑖 = eq-AB @0" $
|
||||
equalE (eqDim (^BV 0) (^K Zero) $ extendDim "𝑖" empty)
|
||||
(^DApp (^F "eq-AB") (^BV 0))
|
||||
(^DApp (^F "eq-AB") (^K Zero)),
|
||||
(^DApp (^F "eq-AB" 0) (^BV 0))
|
||||
(^DApp (^F "eq-AB" 0) (^K Zero)),
|
||||
testNeq "𝑖, 𝑖=1 | ⊢ eq-AB @𝑖 ≠ eq-AB @0" $
|
||||
equalE (eqDim (^BV 0) (^K One) $ extendDim "𝑖" empty)
|
||||
(^DApp (^F "eq-AB") (^BV 0))
|
||||
(^DApp (^F "eq-AB") (^K Zero)),
|
||||
(^DApp (^F "eq-AB" 0) (^BV 0))
|
||||
(^DApp (^F "eq-AB" 0) (^K Zero)),
|
||||
testNeq "𝑖, 𝑗 | ⊢ eq-AB @𝑖 ≠ eq-AB @𝑗" $
|
||||
equalE (extendDim "𝑗" $ extendDim "𝑖" empty)
|
||||
(^DApp (^F "eq-AB") (^BV 1))
|
||||
(^DApp (^F "eq-AB") (^BV 0)),
|
||||
(^DApp (^F "eq-AB" 0) (^BV 1))
|
||||
(^DApp (^F "eq-AB" 0) (^BV 0)),
|
||||
testEq "𝑖, 𝑗, 𝑖=𝑗 | ⊢ eq-AB @𝑖 = eq-AB @𝑗" $
|
||||
equalE (eqDim (^BV 0) (^BV 1) $ extendDim "𝑗" $ extendDim "𝑖" empty)
|
||||
(^DApp (^F "eq-AB") (^BV 1))
|
||||
(^DApp (^F "eq-AB") (^BV 0)),
|
||||
(^DApp (^F "eq-AB" 0) (^BV 1))
|
||||
(^DApp (^F "eq-AB" 0) (^BV 0)),
|
||||
testEq "𝑖, 𝑗, 𝑖=0, 𝑗=0 | ⊢ eq-AB @𝑖 = eq-AB @𝑗" $
|
||||
equalE
|
||||
(eqDim (^BV 0) (^K Zero) $ eqDim (^BV 1) (^K Zero) $
|
||||
extendDim "𝑗" $ extendDim "𝑖" empty)
|
||||
(^DApp (^F "eq-AB") (^BV 1))
|
||||
(^DApp (^F "eq-AB") (^BV 0)),
|
||||
(^DApp (^F "eq-AB" 0) (^BV 1))
|
||||
(^DApp (^F "eq-AB" 0) (^BV 0)),
|
||||
testEq "0=1 | ⊢ eq-AB @𝑖 = eq-AB @𝑗" $
|
||||
equalE (extendDim "𝑗" $ extendDim "𝑖" empty01)
|
||||
(^DApp (^F "eq-AB") (^BV 1))
|
||||
(^DApp (^F "eq-AB") (^BV 0)),
|
||||
(^DApp (^F "eq-AB" 0) (^BV 1))
|
||||
(^DApp (^F "eq-AB" 0) (^BV 0)),
|
||||
testEq "eq-AB @0 = A" $
|
||||
equalE empty (^DApp (^F "eq-AB") (^K Zero)) (^F "A"),
|
||||
equalE empty (^DApp (^F "eq-AB" 0) (^K Zero)) (^F "A" 0),
|
||||
testEq "eq-AB @1 = B" $
|
||||
equalE empty (^DApp (^F "eq-AB") (^K One)) (^F "B"),
|
||||
equalE empty (^DApp (^F "eq-AB" 0) (^K One)) (^F "B" 0),
|
||||
testEq "((δ i ⇒ a) ∷ a ≡ a : A) @0 = a" $
|
||||
equalE empty
|
||||
(^DApp (^Ann (^DLamN (^FT "a")) (^Eq0 (^FT "A") (^FT "a") (^FT "a")))
|
||||
(^DApp (^Ann (^DLamN (^FT "a" 0))
|
||||
(^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a" 0)))
|
||||
(^K Zero))
|
||||
(^F "a"),
|
||||
(^F "a" 0),
|
||||
testEq "((δ i ⇒ a) ∷ a ≡ a : A) @0 = ((δ i ⇒ a) ∷ a ≡ a : A) @1" $
|
||||
equalE empty
|
||||
(^DApp (^Ann (^DLamN (^FT "a")) (^Eq0 (^FT "A") (^FT "a") (^FT "a")))
|
||||
(^DApp (^Ann (^DLamN (^FT "a" 0))
|
||||
(^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a" 0)))
|
||||
(^K Zero))
|
||||
(^DApp (^Ann (^DLamN (^FT "a")) (^Eq0 (^FT "A") (^FT "a") (^FT "a")))
|
||||
(^DApp (^Ann (^DLamN (^FT "a" 0))
|
||||
(^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a" 0)))
|
||||
(^K One))
|
||||
],
|
||||
|
||||
"annotation" :- [
|
||||
testEq "(λ x ⇒ f x) ∷ 1.A → A = f ∷ 1.A → A" $
|
||||
equalE empty
|
||||
(^Ann (^LamY "x" (E $ ^App (^F "f") (^BVT 0)))
|
||||
(^Arr One (^FT "A") (^FT "A")))
|
||||
(^Ann (^FT "f") (^Arr One (^FT "A") (^FT "A"))),
|
||||
(^Ann (^LamY "x" (E $ ^App (^F "f" 0) (^BVT 0)))
|
||||
(^Arr One (^FT "A" 0) (^FT "A" 0)))
|
||||
(^Ann (^FT "f" 0) (^Arr One (^FT "A" 0) (^FT "A" 0))),
|
||||
testEq "f ∷ 1.A → A = f" $
|
||||
equalE empty
|
||||
(^Ann (^FT "f") (^Arr One (^FT "A") (^FT "A")))
|
||||
(^F "f"),
|
||||
(^Ann (^FT "f" 0) (^Arr One (^FT "A" 0) (^FT "A" 0)))
|
||||
(^F "f" 0),
|
||||
testEq "(λ x ⇒ f x) ∷ 1.A → A = f" $
|
||||
equalE empty
|
||||
(^Ann (^LamY "x" (E $ ^App (^F "f") (^BVT 0)))
|
||||
(^Arr One (^FT "A") (^FT "A")))
|
||||
(^F "f")
|
||||
(^Ann (^LamY "x" (E $ ^App (^F "f" 0) (^BVT 0)))
|
||||
(^Arr One (^FT "A" 0) (^FT "A" 0)))
|
||||
(^F "f" 0)
|
||||
],
|
||||
|
||||
"natural type" :- [
|
||||
|
@ -443,9 +454,9 @@ tests = "equality & subtyping" :- [
|
|||
"natural numbers" :- [
|
||||
testEq "0 = 0" $ equalT empty (^Nat) (^Zero) (^Zero),
|
||||
testEq "succ two = succ two" $
|
||||
equalT empty (^Nat) (^Succ (^FT "two")) (^Succ (^FT "two")),
|
||||
equalT empty (^Nat) (^Succ (^FT "two" 0)) (^Succ (^FT "two" 0)),
|
||||
testNeq "succ two ≠ two" $
|
||||
equalT empty (^Nat) (^Succ (^FT "two")) (^FT "two"),
|
||||
equalT empty (^Nat) (^Succ (^FT "two" 0)) (^FT "two" 0),
|
||||
testNeq "0 ≠ 1" $
|
||||
equalT empty (^Nat) (^Zero) (^Succ (^Zero)),
|
||||
testEq "0=1 ⊢ 0 = 1" $
|
||||
|
@ -517,10 +528,10 @@ tests = "equality & subtyping" :- [
|
|||
"elim closure" :- [
|
||||
note "bold numbers for de bruijn indices",
|
||||
testEq "𝟎{a} = a" $
|
||||
equalE empty (CloE (Sub (^BV 0) (^F "a" ::: id))) (^F "a"),
|
||||
equalE empty (CloE (Sub (^BV 0) (^F "a" 0 ::: id))) (^F "a" 0),
|
||||
testEq "𝟏{a} = 𝟎" $
|
||||
equalE (extendTy Any "x" (^FT "A") empty)
|
||||
(CloE (Sub (^BV 1) (^F "a" ::: id))) (^BV 0)
|
||||
equalE (extendTy Any "x" (^FT "A" 0) empty)
|
||||
(CloE (Sub (^BV 1) (^F "a" 0 ::: id))) (^BV 0)
|
||||
],
|
||||
|
||||
"elim d-closure" :- [
|
||||
|
@ -528,40 +539,40 @@ tests = "equality & subtyping" :- [
|
|||
note "0·eq-AB : (A ≡ B : ★₀)",
|
||||
testEq "(eq-AB @𝟎)‹0› = eq-AB @0" $
|
||||
equalE empty
|
||||
(DCloE (Sub (^DApp (^F "eq-AB") (^BV 0)) (^K Zero ::: id)))
|
||||
(^DApp (^F "eq-AB") (^K Zero)),
|
||||
(DCloE (Sub (^DApp (^F "eq-AB" 0) (^BV 0)) (^K Zero ::: id)))
|
||||
(^DApp (^F "eq-AB" 0) (^K Zero)),
|
||||
testEq "(eq-AB @𝟎)‹0› = A" $
|
||||
equalE empty
|
||||
(DCloE (Sub (^DApp (^F "eq-AB") (^BV 0)) (^K Zero ::: id)))
|
||||
(^F "A"),
|
||||
(DCloE (Sub (^DApp (^F "eq-AB" 0) (^BV 0)) (^K Zero ::: id)))
|
||||
(^F "A" 0),
|
||||
testEq "(eq-AB @𝟎)‹1› = B" $
|
||||
equalE empty
|
||||
(DCloE (Sub (^DApp (^F "eq-AB") (^BV 0)) (^K One ::: id)))
|
||||
(^F "B"),
|
||||
(DCloE (Sub (^DApp (^F "eq-AB" 0) (^BV 0)) (^K One ::: id)))
|
||||
(^F "B" 0),
|
||||
testNeq "(eq-AB @𝟎)‹1› ≠ A" $
|
||||
equalE empty
|
||||
(DCloE (Sub (^DApp (^F "eq-AB") (^BV 0)) (^K One ::: id)))
|
||||
(^F "A"),
|
||||
(DCloE (Sub (^DApp (^F "eq-AB" 0) (^BV 0)) (^K One ::: id)))
|
||||
(^F "A" 0),
|
||||
testEq "(eq-AB @𝟎)‹𝟎,0› = (eq-AB 𝟎)" $
|
||||
equalE (extendDim "𝑖" empty)
|
||||
(DCloE (Sub (^DApp (^F "eq-AB") (^BV 0)) (^BV 0 ::: ^K Zero ::: id)))
|
||||
(^DApp (^F "eq-AB") (^BV 0)),
|
||||
(DCloE (Sub (^DApp (^F "eq-AB" 0) (^BV 0)) (^BV 0 ::: ^K Zero ::: id)))
|
||||
(^DApp (^F "eq-AB" 0) (^BV 0)),
|
||||
testNeq "(eq-AB 𝟎)‹0› ≠ (eq-AB 0)" $
|
||||
equalE (extendDim "𝑖" empty)
|
||||
(DCloE (Sub (^DApp (^F "eq-AB") (^BV 0)) (^BV 0 ::: ^K Zero ::: id)))
|
||||
(^DApp (^F "eq-AB") (^K Zero)),
|
||||
(DCloE (Sub (^DApp (^F "eq-AB" 0) (^BV 0)) (^BV 0 ::: ^K Zero ::: id)))
|
||||
(^DApp (^F "eq-AB" 0) (^K Zero)),
|
||||
testEq "𝟎‹0› = 𝟎 # term and dim vars distinct" $
|
||||
equalE
|
||||
(extendTy Any "x" (^FT "A") empty)
|
||||
(extendTy Any "x" (^FT "A" 0) empty)
|
||||
(DCloE (Sub (^BV 0) (^K Zero ::: id))) (^BV 0),
|
||||
testEq "a‹0› = a" $
|
||||
equalE empty
|
||||
(DCloE (Sub (^F "a") (^K Zero ::: id))) (^F "a"),
|
||||
(DCloE (Sub (^F "a" 0) (^K Zero ::: id))) (^F "a" 0),
|
||||
testEq "(f a)‹0› = f‹0› a‹0›" $
|
||||
let th = ^K Zero ::: id in
|
||||
equalE empty
|
||||
(DCloE (Sub (^App (^F "f") (^FT "a")) th))
|
||||
(^App (DCloE (Sub (^F "f") th)) (DCloT (Sub (^FT "a") th)))
|
||||
(DCloE (Sub (^App (^F "f" 0) (^FT "a" 0)) th))
|
||||
(^App (DCloE (Sub (^F "f" 0) th)) (DCloT (Sub (^FT "a" 0) th)))
|
||||
],
|
||||
|
||||
"clashes" :- [
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue