crude but effective stratification

This commit is contained in:
rhiannon morris 2023-05-21 20:09:34 +02:00
parent e4a20cc632
commit 42aa07c9c8
31 changed files with 817 additions and 582 deletions

View file

@ -2,19 +2,19 @@ load "misc.quox";
namespace bool { namespace bool {
def0 Bool : ★ = {true, false}; def0 Bool : ★ = {true, false};
def boolω : 1.Bool → [ω.Bool] = def boolω : 1.Bool → [ω.Bool] =
λ b ⇒ case1 b return [ω.Bool] of { 'true ⇒ ['true]; 'false ⇒ ['false] }; λ b ⇒ case1 b return [ω.Bool] of { 'true ⇒ ['true]; 'false ⇒ ['false] };
def if : 0.(A : ★) → 1.Bool → ω.A → ω.A → A = def if : 0.(A : ★) → 1.Bool → ω.A → ω.A → A =
λ A b t f ⇒ case1 b return A of { 'true ⇒ t; 'false ⇒ f }; λ A b t f ⇒ case1 b return A of { 'true ⇒ t; 'false ⇒ f };
-- [todo]: universe lifting -- [todo]: universe lifting
def0 If : 1.Bool → 0.★₀ → 0.★₀ → ★₀ = def0 If : 1.Bool → 0.★⁰ → 0.★⁰ → ★⁰ =
λ b T F ⇒ case1 b return ★ of { 'true ⇒ T; 'false ⇒ F }; λ b T F ⇒ case1 b return ★ of { 'true ⇒ T; 'false ⇒ F };
def0 T : ω.Bool → ★ = λ b ⇒ If b True False; def0 T : ω.Bool → ★ = λ b ⇒ If b True False;
def true-not-false : Not ('true ≡ 'false : Bool) = def true-not-false : Not ('true ≡ 'false : Bool) =
λ eq ⇒ coe (i ⇒ T (eq @i)) 'true; λ eq ⇒ coe (i ⇒ T (eq @i)) 'true;

View file

@ -3,22 +3,22 @@ load "bool.quox";
namespace either { namespace either {
def0 Tag : ★ = {left, right}; def0 Tag : ★ = {left, right};
def0 Payload : 0.★₀ → 0.★₀ → 1.Tag → ★₀ = def0 Payload : 0.★⁰ → 0.★⁰ → 1.Tag → ★⁰ =
λ A B tag ⇒ case1 tag return ★ of { 'left ⇒ A; 'right ⇒ B }; λ A B tag ⇒ case1 tag return ★ of { 'left ⇒ A; 'right ⇒ B };
def0 Either : 0.★₀ → 0.★₀ → ★₀ = def0 Either : 0.★⁰ → 0.★⁰ → ★⁰ =
λ A B ⇒ (tag : Tag) × Payload A B tag; λ A B ⇒ (tag : Tag) × Payload A B tag;
def Left : 0.(A B : ★) → 1.A → Either A B = def Left : 0.(A B : ★) → 1.A → Either A B =
λ A B x ⇒ ('left, x); λ A B x ⇒ ('left, x);
def Right : 0.(A B : ★) → 1.B → Either A B = def Right : 0.(A B : ★) → 1.B → Either A B =
λ A B x ⇒ ('right, x); λ A B x ⇒ ('right, x);
def elim' : def elim' :
0.(A B : ★₀) → 0.(P : 0.(Either A B) → ★₀) → 0.(A B : ★⁰) → 0.(P : 0.(Either A B) → ★⁰) →
ω.(1.(x : A) → P (Left A B x)) → ω.(1.(x : A) → P (Left A B x)) →
ω.(1.(x : B) → P (Right A B x)) → ω.(1.(x : B) → P (Right A B x)) →
1.(t : Tag) → 1.(a : Payload A B t) → P (t, a) = 1.(t : Tag) → 1.(a : Payload A B t) → P (t, a) =
@ -28,7 +28,7 @@ def elim' :
of { 'left ⇒ f; 'right ⇒ g }; of { 'left ⇒ f; 'right ⇒ g };
def elim : def elim :
0.(A B : ★₀) → 0.(P : 0.(Either A B) → ★₀) → 0.(A B : ★⁰) → 0.(P : 0.(Either A B) → ★⁰) →
ω.(1.(x : A) → P (Left A B x)) → ω.(1.(x : A) → P (Left A B x)) →
ω.(1.(x : B) → P (Right A B x)) → ω.(1.(x : B) → P (Right A B x)) →
1.(x : Either A B) → P x = 1.(x : Either A B) → P x =
@ -45,16 +45,16 @@ def Right = either.Right;
namespace dec { namespace dec {
def0 Dec : 0.★₀ → ★₀ = λ A ⇒ Either [0.A] [0.Not A]; def0 Dec : 0.★⁰ → ★⁰ = λ A ⇒ Either [0.A] [0.Not A];
def Yes : 0.(A : ★) → 0.A → Dec A = λ A y ⇒ Left [0.A] [0.Not A] [y]; def Yes : 0.(A : ★) → 0.A → Dec A = λ A y ⇒ Left [0.A] [0.Not A] [y];
def No : 0.(A : ★) → 0.(Not A) → Dec A = λ A n ⇒ Right [0.A] [0.Not A] [n]; def No : 0.(A : ★) → 0.(Not A) → Dec A = λ A n ⇒ Right [0.A] [0.Not A] [n];
def0 DecEq : 0.★₀ → ★₀ = def0 DecEq : 0.★⁰ → ★⁰ =
λ A ⇒ ω.(x : A) → ω.(y : A) → Dec (x ≡ y : A); λ A ⇒ ω.(x : A) → ω.(y : A) → Dec (x ≡ y : A);
def elim : def elim :
0.(A : ★₀) → 0.(P : 0.(Dec A) → ★₀) → 0.(A : ★⁰) → 0.(P : 0.(Dec A) → ★⁰) →
ω.(0.(y : A) → P (Yes A y)) → ω.(0.(y : A) → P (Yes A y)) →
ω.(0.(n : Not A) → P (No A n)) → ω.(0.(n : Not A) → P (No A n)) →
1.(x : Dec A) → P x = 1.(x : Dec A) → P x =
@ -63,7 +63,7 @@ def elim :
(λ y ⇒ case0 y return y' ⇒ P (Left [0.A] [0.Not A] y') of {[y'] ⇒ f y'}) (λ y ⇒ case0 y return y' ⇒ P (Left [0.A] [0.Not A] y') of {[y'] ⇒ f y'})
(λ n ⇒ case0 n return n' ⇒ P (Right [0.A] [0.Not A] n') of {[n'] ⇒ g n'}); (λ n ⇒ case0 n return n' ⇒ P (Right [0.A] [0.Not A] n') of {[n'] ⇒ g n'});
def bool : 0.(A : ★) → 1.(Dec A) → Bool = def bool : 0.(A : ★) → 1.(Dec A) → Bool =
λ A ⇒ elim A (λ _ ⇒ Bool) (λ _ ⇒ 'true) (λ _ ⇒ 'false); λ A ⇒ elim A (λ _ ⇒ Bool) (λ _ ⇒ 'true) (λ _ ⇒ 'false);
} }

View file

@ -2,23 +2,23 @@ load "nat.quox";
namespace list { namespace list {
def0 Vec : 0. → 0.★₀ → ★₀ = def0 Vec : 0. → 0.★⁰ → ★⁰ =
λ n A ⇒ λ n A ⇒
caseω n return ★ of { caseω n return ★ of {
zero ⇒ {nil}; zero ⇒ {nil};
succ _, 0.Tail ⇒ A × Tail succ _, 0.Tail ⇒ A × Tail
}; };
def0 List : 0.★₀ → ★₀ = def0 List : 0.★⁰ → ★⁰ =
λ A ⇒ (len : ) × Vec len A; λ A ⇒ (len : ) × Vec len A;
def nil : 0.(A : ★) → List A = def nil : 0.(A : ★) → List A =
λ A ⇒ (0, 'nil); λ A ⇒ (0, 'nil);
def cons : 0.(A : ★) → 1.A → 1.(List A) → List A = def cons : 0.(A : ★) → 1.A → 1.(List A) → List A =
λ A x xs ⇒ case1 xs return List A of { (len, elems) ⇒ (succ len, x, elems) }; λ A x xs ⇒ case1 xs return List A of { (len, elems) ⇒ (succ len, x, elems) };
def foldr' : 0.(A B : ★) → def foldr' : 0.(A B : ★) →
1.B → ω.(1.A → 1.B → B) → 1.(n : ) → 1.(Vec n A) → B = 1.B → ω.(1.A → 1.B → B) → 1.(n : ) → 1.(Vec n A) → B =
λ A B z c n ⇒ λ A B z c n ⇒
case1 n return n' ⇒ 1.(Vec n' A) → B of { case1 n return n' ⇒ 1.(Vec n' A) → B of {
@ -28,7 +28,7 @@ def foldr' : 0.(A B : ★₀) →
λ cons ⇒ case1 cons return B of { (first, rest) ⇒ c first (ih rest) } λ cons ⇒ case1 cons return B of { (first, rest) ⇒ c first (ih rest) }
}; };
def foldr : 0.(A B : ★) → 1.B → ω.(1.A → 1.B → B) → 1.(List A) → B = def foldr : 0.(A B : ★) → 1.B → ω.(1.A → 1.B → B) → 1.(List A) → B =
λ A B z c xs ⇒ λ A B z c xs ⇒
case1 xs return B of { (len, elems) ⇒ foldr' A B z c len elems }; case1 xs return B of { (len, elems) ⇒ foldr' A B z c len elems };

View file

@ -1,36 +1,36 @@
def0 True : ★ = {true}; def0 True : ★ = {true};
def0 False : ★ = {}; def0 False : ★ = {};
def0 Not : 0.★₀ → ★₀ = λ A ⇒ ω.A → False; def0 Not : 0.★⁰ → ★⁰ = λ A ⇒ ω.A → False;
def void : 0.(A : ★) → 0.False → A = def void : 0.(A : ★) → 0.False → A =
λ A v ⇒ case0 v return A of { }; λ A v ⇒ case0 v return A of { };
def0 Pred : 0.★₀ → ★₁ = λ A ⇒ 0.A → ★₀; def0 Pred : 0.★⁰ → ★¹ = λ A ⇒ 0.A → ★⁰;
def0 All : 0.(A : ★₀) → 0.(Pred A) → ★₁ = def0 All : 0.(A : ★⁰) → 0.(Pred A) → ★¹ =
λ A P ⇒ 1.(x : A) → P x; λ A P ⇒ 1.(x : A) → P x;
def cong : def cong :
0.(A : ★) → 0.(P : Pred A) → 1.(p : All A P) → 0.(A : ★) → 0.(P : Pred A) → 1.(p : All A P) →
0.(x y : A) → 1.(xy : x ≡ y : A) → Eq (𝑖 ⇒ P (xy @𝑖)) (p x) (p y) = 0.(x y : A) → 1.(xy : x ≡ y : A) → Eq (𝑖 ⇒ P (xy @𝑖)) (p x) (p y) =
λ A P p x y xy ⇒ δ 𝑖 ⇒ p (xy @𝑖); λ A P p x y xy ⇒ δ 𝑖 ⇒ p (xy @𝑖);
def0 eq-f : def0 eq-f :
0.(A : ★) → 0.(P : Pred A) → 0.(A : ★) → 0.(P : Pred A) →
0.(p : All A P) → 0.(q : All A P) → 0.(p : All A P) → 0.(q : All A P) →
0.A → ★ = 0.A → ★ =
λ A P p q x ⇒ p x ≡ q x : P x; λ A P p q x ⇒ p x ≡ q x : P x;
def funext : def funext :
0.(A : ★) → 0.(P : Pred A) → 0.(p q : All A P) → 0.(A : ★) → 0.(P : Pred A) → 0.(p q : All A P) →
1.(All A (eq-f A P p q)) → p ≡ q : All A P = 1.(All A (eq-f A P p q)) → p ≡ q : All A P =
λ A P p q eq ⇒ δ 𝑖 ⇒ λ x ⇒ eq x @𝑖; λ A P p q eq ⇒ δ 𝑖 ⇒ λ x ⇒ eq x @𝑖;
def sym : 0.(A : ★) → 0.(x y : A) → 1.(x ≡ y : A) → y ≡ x : A = def sym : 0.(A : ★) → 0.(x y : A) → 1.(x ≡ y : A) → y ≡ x : A =
λ A x y eq ⇒ δ 𝑖 ⇒ comp A (eq @0) @𝑖 { 0 𝑗 ⇒ eq @𝑗; 1 _ ⇒ eq @0 }; λ A x y eq ⇒ δ 𝑖 ⇒ comp A (eq @0) @𝑖 { 0 𝑗 ⇒ eq @𝑗; 1 _ ⇒ eq @0 };
def trans : 0.(A : ★) → 0.(x y z : A) → def trans : 0.(A : ★) → 0.(x y z : A) →
ω.(x ≡ y : A) → ω.(y ≡ z : A) → x ≡ z : A = ω.(x ≡ y : A) → ω.(y ≡ z : A) → x ≡ z : A =
λ A x y z eq1 eq2 ⇒ δ 𝑖 λ A x y z eq1 eq2 ⇒ δ 𝑖
comp A (eq1 @𝑖) @𝑖 { 0 _ ⇒ eq1 @0; 1 𝑗 ⇒ eq2 @𝑗 }; comp A (eq1 @𝑖) @𝑖 { 0 _ ⇒ eq1 @0; 1 𝑗 ⇒ eq2 @𝑗 };

View file

@ -37,8 +37,8 @@ def0 succ-inj : 0.(m n : ) → 0.(succ m ≡ succ n : ) → m ≡ n :
λ m n eq ⇒ δ 𝑖 ⇒ pred (eq @𝑖); λ m n eq ⇒ δ 𝑖 ⇒ pred (eq @𝑖);
def0 IsSucc : 0. → ★ = def0 IsSucc : 0. → ★ =
λ n ⇒ caseω n return ★ of { zero ⇒ False; succ _ ⇒ True }; λ n ⇒ caseω n return ★ of { zero ⇒ False; succ _ ⇒ True };
def isSucc? : ω.(n : ) → Dec (IsSucc n) = def isSucc? : ω.(n : ) → Dec (IsSucc n) =
λ n ⇒ λ n ⇒

View file

@ -1,35 +1,35 @@
namespace pair { namespace pair {
def0 Σ : 0.(A : ★₀) → 0.(0.A → ★₀) → ★₀ = λ A B ⇒ (x : A) × B x; def0 Σ : 0.(A : ★⁰) → 0.(0.A → ★⁰) → ★⁰ = λ A B ⇒ (x : A) × B x;
def fst : 0.(A : ★₀) → 0.(B : 0.A → ★₀) → ω.(Σ A B) → A = def fst : 0.(A : ★⁰) → 0.(B : 0.A → ★⁰) → ω.(Σ A B) → A =
λ A B p ⇒ caseω p return A of { (x, _) ⇒ x }; λ A B p ⇒ caseω p return A of { (x, _) ⇒ x };
def snd : 0.(A : ★₀) → 0.(B : 0.A → ★₀) → ω.(p : Σ A B) → B (fst A B p) = def snd : 0.(A : ★⁰) → 0.(B : 0.A → ★⁰) → ω.(p : Σ A B) → B (fst A B p) =
λ A B p ⇒ caseω p return p' ⇒ B (fst A B p') of { (_, y) ⇒ y }; λ A B p ⇒ caseω p return p' ⇒ B (fst A B p') of { (_, y) ⇒ y };
def uncurry : def uncurry :
0.(A : ★₀) → 0.(B : 0.A → ★₀) → 0.(C : 0.(x : A) → 0.(B x) → ★₀) → 0.(A : ★⁰) → 0.(B : 0.A → ★⁰) → 0.(C : 0.(x : A) → 0.(B x) → ★⁰) →
1.(f : 1.(x : A) → 1.(y : B x) → C x y) → 1.(f : 1.(x : A) → 1.(y : B x) → C x y) →
1.(p : Σ A B) → C (fst A B p) (snd A B p) = 1.(p : Σ A B) → C (fst A B p) (snd A B p) =
λ A B C f p ⇒ λ A B C f p ⇒
case1 p return p' ⇒ C (fst A B p') (snd A B p') of { (x, y) ⇒ f x y }; case1 p return p' ⇒ C (fst A B p') (snd A B p') of { (x, y) ⇒ f x y };
def uncurry' : def uncurry' :
0.(A B C : ★) → 1.(1.A → 1.B → C) → 1.(A × B) → C = 0.(A B C : ★) → 1.(1.A → 1.B → C) → 1.(A × B) → C =
λ A B C ⇒ uncurry A (λ _ ⇒ B) (λ _ _ ⇒ C); λ A B C ⇒ uncurry A (λ _ ⇒ B) (λ _ _ ⇒ C);
def curry : def curry :
0.(A : ★₀) → 0.(B : 0.A → ★₀) → 0.(C : 0.(Σ A B) → ★₀) → 0.(A : ★⁰) → 0.(B : 0.A → ★⁰) → 0.(C : 0.(Σ A B) → ★⁰) →
1.(f : 1.(p : Σ A B) → C p) → 1.(x : A) → 1.(y : B x) → C (x, y) = 1.(f : 1.(p : Σ A B) → C p) → 1.(x : A) → 1.(y : B x) → C (x, y) =
λ A B C f x y ⇒ f (x, y); λ A B C f x y ⇒ f (x, y);
def curry' : def curry' :
0.(A B C : ★) → 1.(1.(A × B) → C) → 1.A → 1.B → C = 0.(A B C : ★) → 1.(1.(A × B) → C) → 1.A → 1.B → C =
λ A B C ⇒ curry A (λ _ ⇒ B) (λ _ ⇒ C); λ A B C ⇒ curry A (λ _ ⇒ B) (λ _ ⇒ C);
def0 fst-snd : def0 fst-snd :
0.(A : ★₀) → 0.(B : 0.A → ★₀) → 0.(A : ★⁰) → 0.(B : 0.A → ★⁰) →
1.(p : Σ A B) → p ≡ (fst A B p, snd A B p) : Σ A B = 1.(p : Σ A B) → p ≡ (fst A B p, snd A B p) : Σ A B =
λ A B p ⇒ λ A B p ⇒
case1 p case1 p
@ -37,14 +37,14 @@ def0 fst-snd :
of { (x, y) ⇒ δ 𝑖 ⇒ (x, y) }; of { (x, y) ⇒ δ 𝑖 ⇒ (x, y) };
def map : def map :
0.(A A' : ★) → 0.(A A' : ★) →
0.(B : 0.A → ★₀) → 0.(B' : 0.A' → ★₀) → 0.(B : 0.A → ★⁰) → 0.(B' : 0.A' → ★⁰) →
1.(f : 1.A → A') → 1.(g : 0.(x : A) → 1.(B x) → B' (f x)) → 1.(f : 1.A → A') → 1.(g : 0.(x : A) → 1.(B x) → B' (f x)) →
1.(Σ A B) → Σ A' B' = 1.(Σ A B) → Σ A' B' =
λ A A' B B' f g p ⇒ λ A A' B B' f g p ⇒
case1 p return Σ A' B' of { (x, y) ⇒ (f x, g x y) }; case1 p return Σ A' B' of { (x, y) ⇒ (f x, g x y) };
def map' : 0.(A A' B B' : ★) → def map' : 0.(A A' B B' : ★) →
1.(1.A → A') → 1.(1.B → B') → 1.(A × B) → A' × B' = 1.(1.A → A') → 1.(1.B → B') → 1.(A × B) → A' × B' =
λ A A' B B' f g ⇒ map A A' (λ _ ⇒ B) (λ _ ⇒ B') f (λ _ ⇒ g); λ A A' B B' f g ⇒ map A A' (λ _ ⇒ B) (λ _ ⇒ B') f (λ _ ⇒ g);

View file

@ -121,15 +121,29 @@ namespace Char
isOther = isOther . genCat isOther = isOther . genCat
export
isSupDigit : Char -> Bool
isSupDigit ch = ch `elem` unpack "⁰¹²³⁴⁵⁶⁷⁸⁹"
export
isSubDigit : Char -> Bool
isSubDigit ch = ch `elem` unpack "₀₁₂₃₄₅₆₇₈₉"
export
isAsciiDigit : Char -> Bool
isAsciiDigit ch = '0' <= ch && ch <= '9'
export export
isIdStart : Char -> Bool isIdStart : Char -> Bool
isIdStart ch = isIdStart ch =
ch == '_' || isLetter ch || isNumber ch && not ('0' <= ch && ch <= '9') (ch == '_' || isLetter ch || isNumber ch) &&
not (isSupDigit ch || isAsciiDigit ch)
export export
isIdCont : Char -> Bool isIdCont : Char -> Bool
isIdCont ch = isIdCont ch =
isIdStart ch || ch == '\'' || ch == '-' || isMark ch || isNumber ch (isIdStart ch || ch == '\'' || ch == '-' || isMark ch || isNumber ch) &&
not (isSupDigit ch)
export export
isIdConnector : Char -> Bool isIdConnector : Char -> Bool

85
lib/Quox/Displace.idr Normal file
View file

@ -0,0 +1,85 @@
module Quox.Displace
import Quox.Syntax
parameters (k : Universe)
namespace Term
export doDisplace : Term d n -> Term d n
export doDisplaceS : ScopeTermN s d n -> ScopeTermN s d n
export doDisplaceDS : DScopeTermN s d n -> DScopeTermN s d n
namespace Elim
export doDisplace : Elim d n -> Elim d n
namespace Term
doDisplace (TYPE l loc) = TYPE (k + l) loc
doDisplace (Pi qty arg res loc) =
Pi qty (doDisplace arg) (doDisplaceS res) loc
doDisplace (Lam body loc) = Lam (doDisplaceS body) loc
doDisplace (Sig fst snd loc) = Sig (doDisplace fst) (doDisplaceS snd) loc
doDisplace (Pair fst snd loc) = Pair (doDisplace fst) (doDisplace snd) loc
doDisplace (Enum cases loc) = Enum cases loc
doDisplace (Tag tag loc) = Tag tag loc
doDisplace (Eq ty l r loc) =
Eq (doDisplaceDS ty) (doDisplace l) (doDisplace r) loc
doDisplace (DLam body loc) = DLam (doDisplaceDS body) loc
doDisplace (Nat loc) = Nat loc
doDisplace (Zero loc) = Zero loc
doDisplace (Succ p loc) = Succ (doDisplace p) loc
doDisplace (BOX qty ty loc) = BOX qty (doDisplace ty) loc
doDisplace (Box val loc) = Box (doDisplace val) loc
doDisplace (E e) = E (doDisplace e)
doDisplace (CloT (Sub t th)) =
CloT (Sub (doDisplace t) (map doDisplace th))
doDisplace (DCloT (Sub t th)) =
DCloT (Sub (doDisplace t) th)
doDisplaceS (S names (Y body)) = S names $ Y $ doDisplace body
doDisplaceS (S names (N body)) = S names $ N $ doDisplace body
doDisplaceDS (S names (Y body)) = S names $ Y $ doDisplace body
doDisplaceDS (S names (N body)) = S names $ N $ doDisplace body
namespace Elim
doDisplace (F x u loc) = F x (k + u) loc
doDisplace (B i loc) = B i loc
doDisplace (App fun arg loc) = App (doDisplace fun) (doDisplace arg) loc
doDisplace (CasePair qty pair ret body loc) =
CasePair qty (doDisplace pair) (doDisplaceS ret) (doDisplaceS body) loc
doDisplace (CaseEnum qty tag ret arms loc) =
CaseEnum qty (doDisplace tag) (doDisplaceS ret) (map doDisplace arms) loc
doDisplace (CaseNat qty qtyIH nat ret zero succ loc) =
CaseNat qty qtyIH (doDisplace nat) (doDisplaceS ret)
(doDisplace zero) (doDisplaceS succ) loc
doDisplace (CaseBox qty box ret body loc) =
CaseBox qty (doDisplace box) (doDisplaceS ret) (doDisplaceS body) loc
doDisplace (DApp fun arg loc) =
DApp (doDisplace fun) arg loc
doDisplace (Ann tm ty loc) =
Ann (doDisplace tm) (doDisplace ty) loc
doDisplace (Coe ty p q val loc) =
Coe (doDisplaceDS ty) p q (doDisplace val) loc
doDisplace (Comp ty p q val r zero one loc) =
Comp (doDisplace ty) p q (doDisplace val) r
(doDisplaceDS zero) (doDisplaceDS one) loc
doDisplace (TypeCase ty ret arms def loc) =
TypeCase (doDisplace ty) (doDisplace ret)
(map doDisplaceS arms) (doDisplace def) loc
doDisplace (CloE (Sub e th)) =
CloE (Sub (doDisplace e) (map doDisplace th))
doDisplace (DCloE (Sub e th)) =
DCloE (Sub (doDisplace e) th)
namespace Term
export
displace : Universe -> Term d n -> Term d n
displace 0 t = t
displace u t = doDisplace u t
namespace Elim
export
displace : Universe -> Elim d n -> Elim d n
displace 0 t = t
displace u t = doDisplace u t

View file

@ -398,11 +398,11 @@ parameters (defs : Definitions)
(0 ne : NotRedex defs e) -> (0 nf : NotRedex defs f) -> (0 ne : NotRedex defs e) -> (0 nf : NotRedex defs f) ->
Equal_ () Equal_ ()
compare0' ctx e@(F x {}) f@(F y {}) _ _ = compare0' ctx e@(F x u _) f@(F y v _) _ _ =
unless (x == y) $ clashE e.loc ctx e f unless (x == y && u == v) $ clashE e.loc ctx e f
compare0' ctx e@(F {}) f _ _ = clashE e.loc ctx e f compare0' ctx e@(F {}) f _ _ = clashE e.loc ctx e f
compare0' ctx e@(B i {}) f@(B j {}) _ _ = compare0' ctx e@(B i _) f@(B j _) _ _ =
unless (i == j) $ clashE e.loc ctx e f unless (i == j) $ clashE e.loc ctx e f
compare0' ctx e@(B {}) f _ _ = clashE e.loc ctx e f compare0' ctx e@(B {}) f _ _ = clashE e.loc ctx e f
@ -538,6 +538,7 @@ parameters (defs : Definitions)
compare0' _ (Comp {r = B i _, _}) _ _ _ = absurd i compare0' _ (Comp {r = B i _, _}) _ _ _ = absurd i
compare0' _ _ (Comp {r = K _ _, _}) _ nf = void $ absurd $ noOr2 nf compare0' _ _ (Comp {r = K _ _, _}) _ nf = void $ absurd $ noOr2 nf
-- (type case equality purely structural)
compare0' ctx (TypeCase ty1 ret1 arms1 def1 eloc) compare0' ctx (TypeCase ty1 ret1 arms1 def1 eloc)
(TypeCase ty2 ret2 arms2 def2 floc) ne _ = (TypeCase ty2 ret2 arms2 def2 floc) ne _ =
local_ Equal $ do local_ Equal $ do
@ -551,6 +552,11 @@ parameters (defs : Definitions)
(lookupPrecise k arms1) (lookupPrecise k arms2) def1 (lookupPrecise k arms1) (lookupPrecise k arms2) def1
compare0' ctx e@(TypeCase {}) f _ _ = clashE e.loc ctx e f compare0' ctx e@(TypeCase {}) f _ _ = clashE e.loc ctx e f
-- Ψ | Γ ⊢ s <: f ⇐ A
-- --------------------------
-- Ψ | Γ ⊢ (s ∷ A) <: f ⇒ A
--
-- and vice versa
compare0' ctx (Ann s a _) f _ _ = Term.compare0 ctx a s (E f) compare0' ctx (Ann s a _) f _ _ = Term.compare0 ctx a s (E f)
compare0' ctx e (Ann t b _) _ _ = Term.compare0 ctx b (E e) t compare0' ctx e (Ann t b _) _ _ = Term.compare0 ctx b (E e) t
compare0' ctx e@(Ann {}) f _ _ = clashE e.loc ctx e f compare0' ctx e@(Ann {}) f _ _ = clashE e.loc ctx e f

View file

@ -124,7 +124,7 @@ fromList = fromPName . fromListP
export export
syntaxChars : List Char syntaxChars : List Char
syntaxChars = ['(', ')', '[', ']', '{', '}', '"', '\'', ',', '.', ';'] syntaxChars = ['(', ')', '[', ']', '{', '}', '"', '\'', ',', '.', ';', '^']
export export
isSymStart, isSymCont : Char -> Bool isSymStart, isSymCont : Char -> Bool

View file

@ -83,15 +83,16 @@ avoidDim ds loc x =
fromName (const $ throw $ DimNameInTerm loc x.base) (pure . fromPName) ds x fromName (const $ throw $ DimNameInTerm loc x.base) (pure . fromPName) ds x
private private
resolveName : Mods -> Loc -> Name -> Eff FromParserPure (Term d n) resolveName : Mods -> Loc -> Name -> Maybe Universe ->
resolveName ns loc x = Eff FromParserPure (Term d n)
resolveName ns loc x u =
let here = addMods ns x in let here = addMods ns x in
if isJust $ lookup here !(getAt DEFS) then if isJust $ lookup here !(getAt DEFS) then
pure $ FT here loc pure $ FT here (fromMaybe 0 u) loc
else do else do
let ns :< _ = ns let ns :< _ = ns
| _ => throw $ TermNotInScope loc x | _ => throw $ TermNotInScope loc x
resolveName ns loc x resolveName ns loc x u
export export
fromPatVar : PatVar -> BindName fromPatVar : PatVar -> BindName
@ -107,6 +108,17 @@ fromPTagVal : PTagVal -> TagVal
fromPTagVal (PT t _) = t fromPTagVal (PT t _) = t
private
fromV : Context' PatVar d -> Context' PatVar n ->
PName -> Maybe Universe -> Loc -> Eff FromParserPure (Term d n)
fromV ds ns x u loc = fromName bound free ns x where
bound : Var n -> Eff FromParserPure (Term d n)
bound i = do whenJust u $ \u => throw $ DisplacedBoundVar loc x
pure $ E $ B i loc
free : PName -> Eff FromParserPure (Term d n)
free x = do x <- avoidDim ds loc x
resolveName !(getAt NS) loc x u
mutual mutual
export export
fromPTermWith : Context' PatVar d -> Context' PatVar n -> fromPTermWith : Context' PatVar d -> Context' PatVar n ->
@ -199,9 +211,7 @@ mutual
<*> fromPTermTScope ds ns [< b] body <*> fromPTermTScope ds ns [< b] body
<*> pure loc <*> pure loc
V x loc => V x u loc => fromV ds ns x u loc
fromName (\i => pure $ E $ B i loc)
(resolveName !(getAt NS) loc <=< avoidDim ds loc) ns x
Ann s a loc => Ann s a loc =>
map E $ Ann map E $ Ann

View file

@ -24,6 +24,7 @@ data Error =
| DimNotInScope Loc PBaseName | DimNotInScope Loc PBaseName
| QtyNotGlobal Loc Qty | QtyNotGlobal Loc Qty
| DimNameInTerm Loc PBaseName | DimNameInTerm Loc PBaseName
| DisplacedBoundVar Loc PName
| WrapTypeError TypeError | WrapTypeError TypeError
| LoadError Loc String FileError | LoadError Loc String FileError
| WrapParseError String ParseError | WrapParseError String ParseError
@ -89,6 +90,11 @@ parameters (showContext : Bool)
(sep ["dimension" <++> !(hl DVar $ text i), (sep ["dimension" <++> !(hl DVar $ text i),
"used in a term context"]) "used in a term context"])
prettyError (DisplacedBoundVar loc x) = pure $
vappend !(prettyLoc loc)
(sep ["local variable" <++> !(hl TVar $ text $ toDotsP x),
"cannot be displaced"])
prettyError (WrapTypeError err) = prettyError (WrapTypeError err) =
Typing.prettyError showContext $ trimContext 2 err Typing.prettyError showContext $ trimContext 2 err

View file

@ -21,7 +21,8 @@ import Derive.Prelude
||| @ Nat nat literal ||| @ Nat nat literal
||| @ String string literal ||| @ String string literal
||| @ Tag tag literal ||| @ Tag tag literal
||| @ TYPE "Type" or "★" with subscript ||| @ TYPE "Type" or "★" with ascii nat directly after
||| @ Sup superscript or ^ number (displacement, or universe for ★)
public export public export
data Token = data Token =
Reserved String Reserved String
@ -30,6 +31,7 @@ data Token =
| Str String | Str String
| Tag String | Tag String
| TYPE Nat | TYPE Nat
| Sup Nat
%runElab derive "Token" [Eq, Ord, Show] %runElab derive "Token" [Eq, Ord, Show]
-- token or whitespace -- token or whitespace
@ -94,21 +96,33 @@ fromSub c = case c of
'' => '0'; '' => '1'; '' => '2'; '' => '3'; '' => '4' '' => '0'; '' => '1'; '' => '2'; '' => '3'; '' => '4'
'' => '5'; '' => '6'; '' => '7'; '' => '8'; '' => '9'; _ => c '' => '5'; '' => '6'; '' => '7'; '' => '8'; '' => '9'; _ => c
private %inline
fromSup : Char -> Char
fromSup c = case c of
'' => '0'; '¹' => '1'; '²' => '2'; '³' => '3'; '' => '4'
'' => '5'; '' => '6'; '' => '7'; '' => '8'; '' => '9'; _ => c
private %inline private %inline
subToNat : String -> Nat subToNat : String -> Nat
subToNat = cast . pack . map fromSub . unpack subToNat = cast . pack . map fromSub . unpack
private %inline
supToNat : String -> Nat
supToNat = cast . pack . map fromSup . unpack
-- ★0, Type0. base ★/Type is a Reserved
private private
universe : Tokenizer TokenW universe : Tokenizer TokenW
universe = universeWith "" <|> universeWith "Type" where universe = universeWith "" <|> universeWith "Type" where
universeWith : String -> Tokenizer TokenW universeWith : String -> Tokenizer TokenW
universeWith pfx = universeWith pfx =
let len = length pfx in let len = length pfx in
match (exact pfx <+> some (range '0' '9')) match (exact pfx <+> digits) (TYPE . cast . drop len)
(TYPE . cast . drop len) <|>
match (exact pfx <+> some (range '' '')) private
(TYPE . subToNat . drop len) sup : Tokenizer TokenW
sup = match (some $ pred isSupDigit) (Sup . supToNat)
<|> match (is '^' <+> digits) (Sup . cast . drop 1)
private %inline private %inline
@ -219,7 +233,7 @@ tokens = choice $
blockComment (exact "{-") (exact "-}")] <+> blockComment (exact "{-") (exact "-}")] <+>
[universe] <+> -- ★ᵢ takes precedence over bare ★ [universe] <+> -- ★ᵢ takes precedence over bare ★
map resTokenizer reserved <+> map resTokenizer reserved <+>
[nat, string, tag, name] [sup, nat, string, tag, name]
export export
lex : String -> Either Error (List (WithBounds Token)) lex : String -> Either Error (List (WithBounds Token))

View file

@ -106,10 +106,14 @@ export
strLit : Grammar True String strLit : Grammar True String
strLit = terminalMatch "string literal" `(Str s) `(s) strLit = terminalMatch "string literal" `(Str s) `(s)
||| single-token universe, like ★ or Type1 ||| single-token universe, like ★0 or Type1
export export
universe1 : Grammar True Universe universeTok : Grammar True Universe
universe1 = terminalMatch "universe" `(TYPE u) `(u) universeTok = terminalMatch "universe" `(TYPE u) `(u)
export
super : Grammar True Nat
super = terminalMatch "superscript number or '^'" `(Sup n) `(n)
||| possibly-qualified name ||| possibly-qualified name
export export
@ -134,6 +138,11 @@ qtyVal = terminalMatchN "quantity"
[(`(Nat 0), `(Zero)), (`(Nat 1), `(One)), (`(Reserved "ω"), `(Any))] [(`(Nat 0), `(Zero)), (`(Nat 1), `(One)), (`(Reserved "ω"), `(Any))]
||| optional superscript number
export
displacement : Grammar False (Maybe Universe)
displacement = optional super
||| quantity (0, 1, or ω) ||| quantity (0, 1, or ω)
export export
qty : FileName -> Grammar True PQty qty : FileName -> Grammar True PQty
@ -263,6 +272,10 @@ tupleTerm fname = withLoc fname $ do
terms <- delimSep1 "(" ")" "," $ assert_total term fname terms <- delimSep1 "(" ")" "," $ assert_total term fname
pure $ \loc => foldr1 (\s, t => Pair s t loc) terms pure $ \loc => foldr1 (\s, t => Pair s t loc) terms
export
universe1 : Grammar True Universe
universe1 = universeTok <|> res "" *> super
||| argument/atomic term: single-token terms, or those with delimiters e.g. ||| argument/atomic term: single-token terms, or those with delimiters e.g.
||| `[t]` ||| `[t]`
export export
@ -275,7 +288,7 @@ termArg fname = withLoc fname $
<|> Nat <$ res "" <|> Nat <$ res ""
<|> Zero <$ res "zero" <|> Zero <$ res "zero"
<|> [|fromNat nat|] <|> [|fromNat nat|]
<|> [|V qname|] <|> [|V qname displacement|]
<|> const <$> tupleTerm fname <|> const <$> tupleTerm fname
export export
@ -345,7 +358,10 @@ compTerm fname = withLoc fname $ do
export export
splitUniverseTerm : FileName -> Grammar True PTerm splitUniverseTerm : FileName -> Grammar True PTerm
splitUniverseTerm fname = withLoc fname $ resC "" *> mustWork [|TYPE nat|] splitUniverseTerm fname =
withLoc fname $ resC "" *> mustWork [|TYPE $ nat <|> super|]
-- having super here looks redundant, but when parsing a non-atomic term
-- this branch will be taken first
export export
eqTerm : FileName -> Grammar True PTerm eqTerm : FileName -> Grammar True PTerm

View file

@ -87,7 +87,7 @@ namespace PTerm
| BOX PQty PTerm Loc | BOX PQty PTerm Loc
| Box PTerm Loc | Box PTerm Loc
| V PName Loc | V PName (Maybe Universe) Loc
| Ann PTerm PTerm Loc | Ann PTerm PTerm Loc
| Coe (PatVar, PTerm) PDim PDim PTerm Loc | Coe (PatVar, PTerm) PDim PDim PTerm Loc
@ -124,7 +124,7 @@ Located PTerm where
(Succ _ loc).loc = loc (Succ _ loc).loc = loc
(BOX _ _ loc).loc = loc (BOX _ _ loc).loc = loc
(Box _ loc).loc = loc (Box _ loc).loc = loc
(V _ loc).loc = loc (V _ _ loc).loc = loc
(Ann _ _ loc).loc = loc (Ann _ _ loc).loc = loc
(Coe _ _ _ _ loc).loc = loc (Coe _ _ _ _ loc).loc = loc
(Comp _ _ _ _ _ _ _ loc).loc = loc (Comp _ _ _ _ _ _ _ loc).loc = loc

View file

@ -38,7 +38,7 @@ data HL
= Delim = Delim
| Free | TVar | TVarErr | Free | TVar | TVarErr
| Dim | DVar | DVarErr | Dim | DVar | DVarErr
| Qty | Qty | Universe
| Syntax | Syntax
| Tag | Tag
%runElab derive "HL" [Eq, Ord, Show] %runElab derive "HL" [Eq, Ord, Show]
@ -75,13 +75,14 @@ runPrettyWith prec flavor highlight indent act =
export %inline export %inline
toSGR : HL -> List SGR toSGR : HL -> List SGR
toSGR Delim = [] toSGR Delim = []
toSGR Free = [SetForeground BrightBlue]
toSGR TVar = [SetForeground BrightYellow] toSGR TVar = [SetForeground BrightYellow]
toSGR TVarErr = [SetForeground BrightYellow, SetStyle SingleUnderline] toSGR TVarErr = [SetForeground BrightYellow, SetStyle SingleUnderline]
toSGR Dim = [SetForeground BrightGreen] toSGR Dim = [SetForeground BrightGreen]
toSGR DVar = [SetForeground BrightGreen] toSGR DVar = [SetForeground BrightGreen]
toSGR DVarErr = [SetForeground BrightGreen, SetStyle SingleUnderline] toSGR DVarErr = [SetForeground BrightGreen, SetStyle SingleUnderline]
toSGR Qty = [SetForeground BrightMagenta] toSGR Qty = [SetForeground BrightMagenta]
toSGR Free = [SetForeground BrightBlue] toSGR Universe = [SetForeground BrightRed]
toSGR Syntax = [SetForeground BrightCyan] toSGR Syntax = [SetForeground BrightCyan]
toSGR Tag = [SetForeground BrightRed] toSGR Tag = [SetForeground BrightRed]
@ -205,9 +206,13 @@ withPrec : PPrec -> Eff Pretty a -> Eff Pretty a
withPrec = localAt_ PREC withPrec = localAt_ PREC
export
prettyName : Name -> Doc opts
prettyName = text . toDots
export export
prettyFree : {opts : _} -> Name -> Eff Pretty (Doc opts) prettyFree : {opts : _} -> Name -> Eff Pretty (Doc opts)
prettyFree = hl Free . text . toDots prettyFree = hl Free . prettyName
export export
prettyBind' : BindName -> Doc opts prettyBind' : BindName -> Doc opts

View file

@ -3,6 +3,7 @@ module Quox.Reduce
import Quox.No import Quox.No
import Quox.Syntax import Quox.Syntax
import Quox.Definition import Quox.Definition
import Quox.Displace
import Quox.Typing.Context import Quox.Typing.Context
import Quox.Typing.Error import Quox.Typing.Error
import Data.SnocVect import Data.SnocVect
@ -237,9 +238,9 @@ parameters {d, n : Nat} (defs : Definitions) (ctx : WhnfContext d n)
export covering export covering
computeElimType : (e : Elim d n) -> (0 ne : No (isRedexE defs e)) => computeElimType : (e : Elim d n) -> (0 ne : No (isRedexE defs e)) =>
WhnfM (Term d n) WhnfM (Term d n)
computeElimType (F {x, loc}) = do computeElimType (F {x, u, loc}) = do
let Just def = lookup x defs | Nothing => throw $ NotInScope loc x let Just def = lookup x defs | Nothing => throw $ NotInScope loc x
pure $ def.type pure $ displace u def.type
computeElimType (B {i, _}) = pure $ ctx.tctx !! i computeElimType (B {i, _}) = pure $ ctx.tctx !! i
computeElimType (App {fun = f, arg = s, loc}) {ne} = do computeElimType (App {fun = f, arg = s, loc}) {ne} = do
Pi {arg, res, _} <- whnf0 defs ctx =<< computeElimType f {ne = noOr1 ne} Pi {arg, res, _} <- whnf0 defs ctx =<< computeElimType f {ne = noOr1 ne}
@ -253,10 +254,10 @@ parameters {d, n : Nat} (defs : Definitions) (ctx : WhnfContext d n)
Eq {ty, _} <- whnf0 defs ctx =<< computeElimType f {ne = noOr1 ne} Eq {ty, _} <- whnf0 defs ctx =<< computeElimType f {ne = noOr1 ne}
| t => throw $ ExpectedEq loc ctx.names t | t => throw $ ExpectedEq loc ctx.names t
pure $ dsub1 ty p pure $ dsub1 ty p
computeElimType (Ann {ty, _}) = pure ty
computeElimType (Coe {ty, q, _}) = pure $ dsub1 ty q computeElimType (Coe {ty, q, _}) = pure $ dsub1 ty q
computeElimType (Comp {ty, _}) = pure ty computeElimType (Comp {ty, _}) = pure ty
computeElimType (TypeCase {ret, _}) = pure ret computeElimType (TypeCase {ret, _}) = pure ret
computeElimType (Ann {ty, _}) = pure ty
parameters {d, n : Nat} (defs : Definitions) (ctx : WhnfContext (S d) n) parameters {d, n : Nat} (defs : Definitions) (ctx : WhnfContext (S d) n)
||| for π.(x : A) → B, returns (A, B); ||| for π.(x : A) → B, returns (A, B);
@ -477,7 +478,7 @@ reduceTypeCase defs ctx ty u ret arms def loc = case ty of
||| pushes a coercion inside a whnf-ed term ||| pushes a coercion inside a whnf-ed term
private covering private covering
pushCoe : {n, d : Nat} -> (defs : Definitions) -> WhnfContext d n -> pushCoe : {d, n : Nat} -> (defs : Definitions) -> WhnfContext d n ->
BindName -> BindName ->
(ty : Term (S d) n) -> (0 tynf : No (isRedexT defs ty)) => (ty : Term (S d) n) -> (0 tynf : No (isRedexT defs ty)) =>
Dim d -> Dim d -> Dim d -> Dim d ->
@ -524,8 +525,7 @@ pushCoe defs ctx i ty p q s loc =
snd' = E $ CoeT i tsnd' p q snd snd.loc snd' = E $ CoeT i tsnd' p q snd snd.loc
pure $ pure $
Element (Ann (Pair fst' snd' pairLoc) Element (Ann (Pair fst' snd' pairLoc)
(Sig (tfst // one q) (tsnd // one q) sigLoc) loc) (Sig (tfst // one q) (tsnd // one q) sigLoc) loc) Ah
Ah
-- η expand, like for Lam -- η expand, like for Lam
-- --
@ -569,9 +569,9 @@ where
export covering export covering
Whnf Elim Reduce.isRedexE where Whnf Elim Reduce.isRedexE where
whnf defs ctx (F x loc) with (lookupElim x defs) proof eq whnf defs ctx (F x u loc) with (lookupElim x defs) proof eq
_ | Just y = whnf defs ctx $ setLoc loc y _ | Just y = whnf defs ctx $ setLoc loc $ displace u y
_ | Nothing = pure $ Element (F x loc) $ rewrite eq in Ah _ | Nothing = pure $ Element (F x u loc) $ rewrite eq in Ah
whnf _ _ (B i loc) = pure $ nred $ B i loc whnf _ _ (B i loc) = pure $ nred $ B i loc
@ -659,10 +659,10 @@ Whnf Elim Reduce.isRedexE where
Right nb => Right nb =>
pure $ Element (CaseBox pi box ret body caseLoc) $ boxnf `orNo` nb pure $ Element (CaseBox pi box ret body caseLoc) $ boxnf `orNo` nb
-- ((δ 𝑖 ⇒ s) ∷ Eq [𝑗 ⇒ A] t u) @0 ⇝ t ∷ A0/𝑗 -- e : Eq (𝑗 ⇒ A) t u ⊢ e @0 ⇝ t ∷ A0/𝑗
-- ((δ 𝑖 ⇒ s) ∷ Eq [𝑗 ⇒ A] t u) @1 ⇝ u ∷ A1/𝑗 -- e : Eq (𝑗 ⇒ A) t u ⊢ e @1 ⇝ u ∷ A1/𝑗
-- ((δ 𝑖 ⇒ s) ∷ Eq [𝑗 ⇒ A] t u) @𝑘 ⇝ s𝑘/𝑖 ∷ A𝑘/𝑗 --
-- (if 𝑘 is a variable) -- ((δ 𝑖 ⇒ s) ∷ Eq (𝑗 ⇒ A) t u) @𝑘 ⇝ s𝑘/𝑖 ∷ A𝑘/𝑗
whnf defs ctx (DApp f p appLoc) = do whnf defs ctx (DApp f p appLoc) = do
Element f fnf <- whnf defs ctx f Element f fnf <- whnf defs ctx f
case nchoose $ isDLamHead f of case nchoose $ isDLamHead f of

View file

@ -134,8 +134,11 @@ mutual
||| first argument `d` is dimension scope size, second `n` is term scope size ||| first argument `d` is dimension scope size, second `n` is term scope size
public export public export
data Elim : (d, n : Nat) -> Type where data Elim : (d, n : Nat) -> Type where
||| free variable ||| free variable, possibly with a displacement (see @crude, or @mugen for a
F : (x : Name) -> (loc : Loc) -> Elim d n ||| more abstract and formalised take)
|||
||| e.g. if f : ★₀ → ★₁, then f¹ : ★₁ → ★₂
F : (x : Name) -> (u : Universe) -> (loc : Loc) -> Elim d n
||| bound variable ||| bound variable
B : (i : Var n) -> (loc : Loc) -> Elim d n B : (i : Var n) -> (loc : Loc) -> Elim d n
@ -318,8 +321,8 @@ Eq0 {ty, l, r, loc} = Eq {ty = SN ty, l, r, loc}
||| same as `F` but as a term ||| same as `F` but as a term
public export %inline public export %inline
FT : Name -> (loc : Loc) -> Term d n FT : Name -> Universe -> Loc -> Term d n
FT x loc = E $ F x loc FT x u loc = E $ F x u loc
||| abbreviation for a bound variable like `BV 4` instead of ||| abbreviation for a bound variable like `BV 4` instead of
||| `B (VS (VS (VS (VS VZ))))` ||| `B (VS (VS (VS (VS VZ))))`
@ -357,7 +360,7 @@ typeCase1Y ty ret k ns body loc = typeCase ty ret [(k ** SY ns body)] def loc
export export
Located (Elim d n) where Located (Elim d n) where
(F _ loc).loc = loc (F _ _ loc).loc = loc
(B _ loc).loc = loc (B _ loc).loc = loc
(App _ _ loc).loc = loc (App _ _ loc).loc = loc
(CasePair _ _ _ _ loc).loc = loc (CasePair _ _ _ _ loc).loc = loc
@ -404,7 +407,7 @@ Located1 f => Located (Scoped s f n) where
export export
Relocatable (Elim d n) where Relocatable (Elim d n) where
setLoc loc (F x _) = F x loc setLoc loc (F x u _) = F x u loc
setLoc loc (B i _) = B i loc setLoc loc (B i _) = B i loc
setLoc loc (App fun arg _) = App fun arg loc setLoc loc (App fun arg _) = App fun arg loc
setLoc loc (CasePair qty pair ret body _) = setLoc loc (CasePair qty pair ret body _) =

View file

@ -14,7 +14,7 @@ import Derive.Prelude
export export
prettyUniverse : {opts : _} -> Universe -> Eff Pretty (Doc opts) prettyUniverse : {opts : _} -> Universe -> Eff Pretty (Doc opts)
prettyUniverse = hl Syntax . text . show prettyUniverse = hl Universe . text . show
export export
@ -38,6 +38,14 @@ subscript = pack . map sub . unpack where
'0' => ''; '1' => ''; '2' => ''; '3' => ''; '4' => '' '0' => ''; '1' => ''; '2' => ''; '3' => ''; '4' => ''
'5' => ''; '6' => ''; '7' => ''; '8' => ''; '9' => ''; _ => c '5' => ''; '6' => ''; '7' => ''; '8' => ''; '9' => ''; _ => c
private
superscript : String -> String
superscript = pack . map sup . unpack where
sup : Char -> Char
sup c = case c of
'0' => ''; '1' => '¹'; '2' => '²'; '3' => '³'; '4' => ''
'5' => ''; '6' => ''; '7' => ''; '8' => ''; '9' => ''; _ => c
private private
PiBind : Nat -> Nat -> Type PiBind : Nat -> Nat -> Type
@ -368,11 +376,19 @@ where
header cs = sep <$> traverse (\(s, xs) => header1 s (toList xs)) (toList cs) header cs = sep <$> traverse (\(s, xs) => header1 s (toList xs)) (toList cs)
prettyDisp : {opts : _} -> Universe -> Eff Pretty (Maybe (Doc opts))
prettyDisp 0 = pure Nothing
prettyDisp u = map Just $ hl Universe =<<
ifUnicode (text $ superscript $ show u) (text $ "^" ++ show u)
prettyTerm dnames tnames (TYPE l _) = prettyTerm dnames tnames (TYPE l _) =
hl Syntax =<<
case !(askAt FLAVOR) of case !(askAt FLAVOR) of
Unicode => pure $ text $ "" ++ subscript (show l) Unicode => do
Ascii => prettyAppD (text "Type") [text $ show l] star <- hl Syntax ""
level <- hl Universe $ text $ superscript $ show l
pure $ hcat [star, level]
Ascii => [|hl Syntax "Type" <++> hl Universe (text $ show l)|]
prettyTerm dnames tnames (Pi qty arg res _) = prettyTerm dnames tnames (Pi qty arg res _) =
parensIfM Outer =<< do parensIfM Outer =<< do
@ -455,8 +471,10 @@ prettyTerm dnames tnames t0@(CloT (Sub t ph)) =
prettyTerm dnames tnames t0@(DCloT (Sub t ph)) = prettyTerm dnames tnames t0@(DCloT (Sub t ph)) =
prettyTerm dnames tnames $ assert_smaller t0 $ pushSubstsWith' ph id t prettyTerm dnames tnames $ assert_smaller t0 $ pushSubstsWith' ph id t
prettyElim dnames tnames (F x _) = prettyElim dnames tnames (F x u _) = do
prettyFree x x <- prettyFree x
u <- prettyDisp u
pure $ maybe x (x <+>) u
prettyElim dnames tnames (B i _) = prettyElim dnames tnames (B i _) =
prettyTBind $ tnames !!! i prettyTBind $ tnames !!! i

View file

@ -39,7 +39,7 @@ subDArgs e th = DCloE $ Sub e th
export export
CanDSubst Elim where CanDSubst Elim where
e // Shift SZ = e e // Shift SZ = e
F x loc // _ = F x loc F x u loc // _ = F x u loc
B i loc // _ = B i loc B i loc // _ = B i loc
e@(DApp {}) // th = subDArgs e th e@(DApp {}) // th = subDArgs e th
DCloE (Sub e ph) // th = DCloE $ Sub e $ ph . th DCloE (Sub e ph) // th = DCloE $ Sub e $ ph . th
@ -73,7 +73,7 @@ export %inline FromVar (Term d) where fromVarLoc = E .: fromVar
||| - otherwise, wraps in a new closure ||| - otherwise, wraps in a new closure
export export
CanSubstSelf (Elim d) where CanSubstSelf (Elim d) where
F x loc // _ = F x loc F x u loc // _ = F x u loc
B i loc // th = getLoc th i loc B i loc // th = getLoc th i loc
CloE (Sub e ph) // th = assert_total CloE $ Sub e $ ph . th CloE (Sub e ph) // th = assert_total CloE $ Sub e $ ph . th
e // th = case force th of e // th = case force th of
@ -292,8 +292,8 @@ mutual
export export
PushSubsts Elim Subst.isCloE where PushSubsts Elim Subst.isCloE where
pushSubstsWith th ph (F x loc) = pushSubstsWith th ph (F x u loc) =
nclo $ F x loc nclo $ F x u loc
pushSubstsWith th ph (B i loc) = pushSubstsWith th ph (B i loc) =
let res = getLoc ph i loc in let res = getLoc ph i loc in
case nchoose $ isCloE res of case nchoose $ isCloE res of

View file

@ -90,8 +90,8 @@ mutual
private private
tightenE : OPE n1 n2 -> Elim d n2 -> Maybe (Elim d n1) tightenE : OPE n1 n2 -> Elim d n2 -> Maybe (Elim d n1)
tightenE p (F x loc) = tightenE p (F x u loc) =
pure $ F x loc pure $ F x u loc
tightenE p (B i loc) = tightenE p (B i loc) =
B <$> tighten p i <*> pure loc B <$> tighten p i <*> pure loc
tightenE p (App fun arg loc) = tightenE p (App fun arg loc) =
@ -204,8 +204,8 @@ mutual
export export
dtightenE : OPE d1 d2 -> Elim d2 n -> Maybe (Elim d1 n) dtightenE : OPE d1 d2 -> Elim d2 n -> Maybe (Elim d1 n)
dtightenE p (F x loc) = dtightenE p (F x u loc) =
pure $ F x loc pure $ F x u loc
dtightenE p (B i loc) = dtightenE p (B i loc) =
pure $ B i loc pure $ B i loc
dtightenE p (App fun arg loc) = dtightenE p (App fun arg loc) =

View file

@ -2,6 +2,7 @@ module Quox.Typechecker
import public Quox.Typing import public Quox.Typing
import public Quox.Equal import public Quox.Equal
import Quox.Displace
import Data.List import Data.List
import Data.SnocVect import Data.SnocVect
@ -107,6 +108,12 @@ mutual
TC (CheckResult' n) TC (CheckResult' n)
checkC ctx sg subj ty = checkC ctx sg subj ty =
wrapErr (WhileChecking ctx sg.fst subj ty) $ wrapErr (WhileChecking ctx sg.fst subj ty) $
checkCNoWrap ctx sg subj ty
export covering %inline
checkCNoWrap : (ctx : TyContext d n) -> SQty -> Term d n -> Term d n ->
TC (CheckResult' n)
checkCNoWrap ctx sg subj ty =
let Element subj nc = pushSubsts subj in let Element subj nc = pushSubsts subj in
check' ctx sg subj ty check' ctx sg subj ty
@ -324,14 +331,14 @@ mutual
(subj : Elim d n) -> (0 nc : NotClo subj) => (subj : Elim d n) -> (0 nc : NotClo subj) =>
TC (InferResult' d n) TC (InferResult' d n)
infer' ctx sg (F x loc) = do infer' ctx sg (F x u loc) = do
-- if π·x : A {≔ s} in global context -- if π·x : A {≔ s} in global context
g <- lookupFree x loc !defs g <- lookupFree x loc !defs
-- if σ ≤ π -- if σ ≤ π
expectCompatQ loc sg.fst g.qty.fst expectCompatQ loc sg.fst g.qty.fst
-- then Ψ | Γ ⊢ σ · x ⇒ A ⊳ 𝟎 -- then Ψ | Γ ⊢ σ · x ⇒ A ⊳ 𝟎
let Val d = ctx.dimLen; Val n = ctx.termLen let Val d = ctx.dimLen; Val n = ctx.termLen
pure $ InfRes {type = g.type, qout = zeroFor ctx} pure $ InfRes {type = displace u g.type, qout = zeroFor ctx}
infer' ctx sg (B i _) = infer' ctx sg (B i _) =
-- if x : A ∈ Γ -- if x : A ∈ Γ

View file

@ -31,6 +31,7 @@ modules =
Quox.Syntax.Term.Pretty, Quox.Syntax.Term.Pretty,
Quox.Syntax.Term.Subst, Quox.Syntax.Term.Subst,
Quox.Syntax.Var, Quox.Syntax.Var,
Quox.Displace,
Quox.Definition, Quox.Definition,
Quox.Reduce, Quox.Reduce,
Quox.Context, Quox.Context,

View file

@ -63,12 +63,14 @@ comp = "comp", type line, [dim arg, dim arg],
comp body = "{", comp branch, ";", comp branch, [";"], "}". comp body = "{", comp branch, ";", comp branch, [";"], "}".
comp branch = dim const, name, "⇒", term. comp branch = dim const, name, "⇒", term.
term arg = UNIVERSE displacement = SUPER.
term arg = UNIVERSE | "★", SUPER
| "{", {BARE TAG / ","}, [","], "}" | "{", {BARE TAG / ","}, [","], "}"
| TAG | TAG
| "[", [qty, "."], term, "]" | "[", [qty, "."], term, "]"
| "" | ""
| "zero" | "zero"
| NAT | NAT
| QNAME | QNAME, displacement
| "(", {term / ","}+, [","], ")". | "(", {term / ","}+, [","], ")".

View file

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

View file

@ -93,7 +93,7 @@ tests = "PTerm → Term" :- [
note "dim ctx: [𝑖, 𝑗]; term ctx: [A, x, y, z]", note "dim ctx: [𝑖, 𝑗]; term ctx: [A, x, y, z]",
parseMatch term fromPTerm "x" `(E $ B (VS $ VS VZ) _), parseMatch term fromPTerm "x" `(E $ B (VS $ VS VZ) _),
parseFails term fromPTerm "𝑖", parseFails term fromPTerm "𝑖",
parseMatch term fromPTerm "f" `(E $ F "f" _), parseMatch term fromPTerm "f" `(E $ F "f" {}),
parseMatch term fromPTerm "λ w ⇒ w" parseMatch term fromPTerm "λ w ⇒ w"
`(Lam (S _ $ Y $ E $ B VZ _) _), `(Lam (S _ $ Y $ E $ B VZ _) _),
parseMatch term fromPTerm "λ w ⇒ x" parseMatch term fromPTerm "λ w ⇒ x"
@ -103,9 +103,10 @@ tests = "PTerm → Term" :- [
parseMatch term fromPTerm "λ a b ⇒ f a b" parseMatch term fromPTerm "λ a b ⇒ f a b"
`(Lam (S _ $ Y $ `(Lam (S _ $ Y $
Lam (S _ $ Y $ Lam (S _ $ Y $
E $ App (App (F "f" _) (E $ B (VS VZ) _) _) (E $ B VZ _) _) _) _), E $ App (App (F "f" {}) (E $ B (VS VZ) _) _) (E $ B VZ _) _) _) _),
parseMatch term fromPTerm "f @𝑖" $ parseMatch term fromPTerm "f @𝑖" $
`(E $ DApp (F "f" _) (B (VS VZ) _) _) `(E $ DApp (F "f" {}) (B (VS VZ) _) _),
parseFails term fromPTerm "λ x ⇒ x¹"
], ],
todo "everything else" todo "everything else"

View file

@ -74,10 +74,9 @@ tests = "lexer" :- [
lexes "uhh??!?!?!?" [Name "uhh??!?!?!?"], lexes "uhh??!?!?!?" [Name "uhh??!?!?!?"],
todo "check for reserved words in a qname", todo "check for reserved words in a qname",
{- skip $
lexes "abc.fun.def" lexes "abc.fun.def"
[Name "abc", Reserved ".", Reserved "λ", Reserved ".", Name "def"], [Name "abc", Reserved ".", Reserved "λ", Reserved ".", Name "def"],
-}
lexes "+" [Name "+"], lexes "+" [Name "+"],
lexes "*" [Name "*"], lexes "*" [Name "*"],
@ -110,6 +109,10 @@ tests = "lexer" :- [
lexes "a'" [Name "a'"], lexes "a'" [Name "a'"],
lexes "+'" [Name "+'"], lexes "+'" [Name "+'"],
lexes "a₁" [Name "a₁"],
lexes "a⁰" [Name "a", Sup 0],
lexes "a^0" [Name "a", Sup 0],
lexes "0.x" [Nat 0, Reserved ".", Name "x"], lexes "0.x" [Nat 0, Reserved ".", Name "x"],
lexes "1.x" [Nat 1, Reserved ".", Name "x"], lexes "1.x" [Nat 1, Reserved ".", Name "x"],
lexes "ω.x" [Reserved "ω", Reserved ".", Name "x"], lexes "ω.x" [Reserved "ω", Reserved ".", Name "x"],
@ -119,7 +122,7 @@ tests = "lexer" :- [
"syntax characters" :- [ "syntax characters" :- [
lexes "()" [Reserved "(", Reserved ")"], lexes "()" [Reserved "(", Reserved ")"],
lexes "(a)" [Reserved "(", Name "a", Reserved ")"], lexes "(a)" [Reserved "(", Name "a", Reserved ")"],
lexes "(^)" [Reserved "(", Name "^", Reserved ")"], lexFail "(^)",
lexes "{a,b}" lexes "{a,b}"
[Reserved "{", Name "a", Reserved ",", Name "b", Reserved "}"], [Reserved "{", Name "a", Reserved ",", Name "b", Reserved "}"],
lexes "{+,-}" lexes "{+,-}"
@ -151,10 +154,10 @@ tests = "lexer" :- [
"universes" :- [ "universes" :- [
lexes "Type0" [TYPE 0], lexes "Type0" [TYPE 0],
lexes "Type" [TYPE 0], lexes "Type" [Reserved "", Sup 0],
lexes "Type9999999" [TYPE 9999999], lexes "Type9999999" [TYPE 9999999],
lexes "" [TYPE 0], lexes "" [Reserved "", Sup 0],
lexes "₆₉" [TYPE 69], lexes "⁶⁹" [Reserved "", Sup 69],
lexes "★4" [TYPE 4], lexes "★4" [TYPE 4],
lexes "Type" [Reserved ""], lexes "Type" [Reserved ""],
lexes "" [Reserved ""] lexes "" [Reserved ""]

View file

@ -72,7 +72,7 @@ tests = "parser" :- [
"dimensions" :- [ "dimensions" :- [
parseMatch dim "0" `(K Zero _), parseMatch dim "0" `(K Zero _),
parseMatch dim "1" `(K One _), parseMatch dim "1" `(K One _),
parseMatch dim "𝑖" `(V "𝑖" _), parseMatch dim "𝑖" `(V "𝑖" {}),
parseFails dim "M.x", parseFails dim "M.x",
parseFails dim "_" parseFails dim "_"
], ],
@ -105,14 +105,14 @@ tests = "parser" :- [
parseMatch term #" '"a b c" "# `(Tag "a b c" _), parseMatch term #" '"a b c" "# `(Tag "a b c" _),
note "application to two arguments", note "application to two arguments",
parseMatch term #" 'a b c "# parseMatch term #" 'a b c "#
`(App (App (Tag "a" _) (V "b" _) _) (V "c" _) _) `(App (App (Tag "a" _) (V "b" {}) _) (V "c" {}) _)
], ],
"universes" :- [ "universes" :- [
parseMatch term "" `(TYPE 0 _), parseMatch term "" `(TYPE 0 _),
parseMatch term "★1" `(TYPE 1 _), parseMatch term "★1" `(TYPE 1 _),
parseMatch term "★ 2" `(TYPE 2 _), parseMatch term "★ 2" `(TYPE 2 _),
parseMatch term "Type" `(TYPE 3 _), parseMatch term "Type³" `(TYPE 3 _),
parseMatch term "Type4" `(TYPE 4 _), parseMatch term "Type4" `(TYPE 4 _),
parseMatch term "Type 100" `(TYPE 100 _), parseMatch term "Type 100" `(TYPE 100 _),
parseMatch term "(Type 1000)" `(TYPE 1000 _), parseMatch term "(Type 1000)" `(TYPE 1000 _),
@ -122,137 +122,139 @@ tests = "parser" :- [
"applications" :- [ "applications" :- [
parseMatch term "f" parseMatch term "f"
`(V "f" _), `(V "f" {}),
parseMatch term "f.x.y" parseMatch term "f.x.y"
`(V (MakePName [< "f", "x"] "y") _), `(V (MakePName [< "f", "x"] "y") {}),
parseMatch term "f x" parseMatch term "f x"
`(App (V "f" _) (V "x" _) _), `(App (V "f" {}) (V "x" {}) _),
parseMatch term "f x y" parseMatch term "f x y"
`(App (App (V "f" _) (V "x" _) _) (V "y" _) _), `(App (App (V "f" {}) (V "x" {}) _) (V "y" {}) _),
parseMatch term "(f x) y" parseMatch term "(f x) y"
`(App (App (V "f" _) (V "x" _) _) (V "y" _) _), `(App (App (V "f" {}) (V "x" {}) _) (V "y" {}) _),
parseMatch term "f (g x)" parseMatch term "f (g x)"
`(App (V "f" _) (App (V "g" _) (V "x" _) _) _), `(App (V "f" {}) (App (V "g" {}) (V "x" {}) _) _),
parseMatch term "f (g x) y" parseMatch term "f (g x) y"
`(App (App (V "f" _) (App (V "g" _) (V "x" _) _) _) (V "y" _) _), `(App (App (V "f" {}) (App (V "g" {}) (V "x" {}) _) _) (V "y" {}) _),
parseMatch term "f @p" parseMatch term "f @p"
`(DApp (V "f" _) (V "p" _) _), `(DApp (V "f" {}) (V "p" {}) _),
parseMatch term "f x @p y" parseMatch term "f x @p y"
`(App (DApp (App (V "f" _) (V "x" _) _) (V "p" _) _) (V "y" _) _) `(App (DApp (App (V "f" {}) (V "x" {}) _) (V "p" {}) _) (V "y" {}) _)
], ],
"annotations" :- [ "annotations" :- [
parseMatch term "f :: A" parseMatch term "f :: A"
`(Ann (V "f" _) (V "A" _) _), `(Ann (V "f" {}) (V "A" {}) _),
parseMatch term "f ∷ A" parseMatch term "f ∷ A"
`(Ann (V "f" _) (V "A" _) _), `(Ann (V "f" {}) (V "A" {}) _),
parseMatch term "f x y ∷ A B C" parseMatch term "f x y ∷ A B C"
`(Ann (App (App (V "f" _) (V "x" _) _) (V "y" _) _) `(Ann (App (App (V "f" {}) (V "x" {}) _) (V "y" {}) _)
(App (App (V "A" _) (V "B" _) _) (V "C" _) _) _), (App (App (V "A" {}) (V "B" {}) _) (V "C" {}) _) _),
parseMatch term "Type 0 ∷ Type 1 ∷ Type 2" parseMatch term "Type 0 ∷ Type 1 ∷ Type 2"
`(Ann (TYPE 0 _) (Ann (TYPE 1 _) (TYPE 2 _) _) _) `(Ann (TYPE 0 _) (Ann (TYPE 1 _) (TYPE 2 _) _) _)
], ],
"binders" :- [ "binders" :- [
parseMatch term "1.(x : A) → B x" parseMatch term "1.(x : A) → B x"
`(Pi (PQ One _) (PV "x" _) (V "A" _) (App (V "B" _) (V "x" _) _) _), `(Pi (PQ One _) (PV "x" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _),
parseMatch term "1.(x : A) -> B x" parseMatch term "1.(x : A) -> B x"
`(Pi (PQ One _) (PV "x" _) (V "A" _) (App (V "B" _) (V "x" _) _) _), `(Pi (PQ One _) (PV "x" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _),
parseMatch term "ω.(x : A) → B x" parseMatch term "ω.(x : A) → B x"
`(Pi (PQ Any _) (PV "x" _) (V "A" _) (App (V "B" _) (V "x" _) _) _), `(Pi (PQ Any _) (PV "x" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _),
parseMatch term "#.(x : A) -> B x" parseMatch term "#.(x : A) -> B x"
`(Pi (PQ Any _) (PV "x" _) (V "A" _) (App (V "B" _) (V "x" _) _) _), `(Pi (PQ Any _) (PV "x" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _),
parseMatch term "1.(x y : A) -> B x" parseMatch term "1.(x y : A) -> B x"
`(Pi (PQ One _) (PV "x" _) (V "A" _) `(Pi (PQ One _) (PV "x" _) (V "A" {})
(Pi (PQ One _) (PV "y" _) (V "A" _) (Pi (PQ One _) (PV "y" _) (V "A" {})
(App (V "B" _) (V "x" _) _) _) _), (App (V "B" {}) (V "x" {}) _) _) _),
parseFails term "(x : A) → B x", parseFails term "(x : A) → B x",
parseMatch term "1.A → B" parseMatch term "1.A → B"
`(Pi (PQ One _) (Unused _) (V "A" _) (V "B" _) _), `(Pi (PQ One _) (Unused _) (V "A" {}) (V "B" {}) _),
parseMatch term "1.(List A) → List B" parseMatch term "1.(List A) → List B"
`(Pi (PQ One _) (Unused _) `(Pi (PQ One _) (Unused _)
(App (V "List" _) (V "A" _) _) (App (V "List" {}) (V "A" {}) _)
(App (V "List" _) (V "B" _) _) _), (App (V "List" {}) (V "B" {}) _) _),
parseMatch term "0.★⁰ → ★⁰"
`(Pi (PQ Zero _) (Unused _) (TYPE 0 _) (TYPE 0 _) _),
parseFails term "1.List A → List B", parseFails term "1.List A → List B",
parseMatch term "(x : A) × B x" parseMatch term "(x : A) × B x"
`(Sig (PV "x" _) (V "A" _) (App (V "B" _) (V "x" _) _) _), `(Sig (PV "x" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _),
parseMatch term "(x : A) ** B x" parseMatch term "(x : A) ** B x"
`(Sig (PV "x" _) (V "A" _) (App (V "B" _) (V "x" _) _) _), `(Sig (PV "x" _) (V "A" {}) (App (V "B" {}) (V "x" {}) _) _),
parseMatch term "(x y : A) × B" $ parseMatch term "(x y : A) × B" $
`(Sig (PV "x" _) (V "A" _) (Sig (PV "y" _) (V "A" _) (V "B" _) _) _), `(Sig (PV "x" _) (V "A" {}) (Sig (PV "y" _) (V "A" {}) (V "B" {}) _) _),
parseFails term "1.(x : A) × B x", parseFails term "1.(x : A) × B x",
parseMatch term "A × B" parseMatch term "A × B"
`(Sig (Unused _) (V "A" _) (V "B" _) _), `(Sig (Unused _) (V "A" {}) (V "B" {}) _),
parseMatch term "A ** B" parseMatch term "A ** B"
`(Sig (Unused _) (V "A" _) (V "B" _) _), `(Sig (Unused _) (V "A" {}) (V "B" {}) _),
parseMatch term "A × B × C" $ parseMatch term "A × B × C" $
`(Sig (Unused _) (V "A" _) (Sig (Unused _) (V "B" _) (V "C" _) _) _), `(Sig (Unused _) (V "A" {}) (Sig (Unused _) (V "B" {}) (V "C" {}) _) _),
parseMatch term "(A × B) × C" $ parseMatch term "(A × B) × C" $
`(Sig (Unused _) (Sig (Unused _) (V "A" _) (V "B" _) _) (V "C" _) _) `(Sig (Unused _) (Sig (Unused _) (V "A" {}) (V "B" {}) _) (V "C" {}) _)
], ],
"lambdas" :- [ "lambdas" :- [
parseMatch term "λ x ⇒ x" parseMatch term "λ x ⇒ x"
`(Lam (PV "x" _) (V "x" _) _), `(Lam (PV "x" _) (V "x" {}) _),
parseMatch term "fun x => x" parseMatch term "fun x => x"
`(Lam (PV "x" _) (V "x" _) _), `(Lam (PV "x" _) (V "x" {}) _),
parseMatch term "δ i ⇒ x @i" parseMatch term "δ i ⇒ x @i"
`(DLam (PV "i" _) (DApp (V "x" _) (V "i" _) _) _), `(DLam (PV "i" _) (DApp (V "x" {}) (V "i" {}) _) _),
parseMatch term "dfun i => x @i" parseMatch term "dfun i => x @i"
`(DLam (PV "i" _) (DApp (V "x" _) (V "i" _) _) _), `(DLam (PV "i" _) (DApp (V "x" {}) (V "i" {}) _) _),
parseMatch term "λ x y z ⇒ x z y" parseMatch term "λ x y z ⇒ x z y"
`(Lam (PV "x" _) `(Lam (PV "x" _)
(Lam (PV "y" _) (Lam (PV "y" _)
(Lam (PV "z" _) (Lam (PV "z" _)
(App (App (V "x" _) (V "z" _) _) (V "y" _) _) _) _) _) (App (App (V "x" {}) (V "z" {}) _) (V "y" {}) _) _) _) _)
], ],
"pairs" :- [ "pairs" :- [
parseMatch term "(x, y)" parseMatch term "(x, y)"
`(Pair (V "x" _) (V "y" _) _), `(Pair (V "x" {}) (V "y" {}) _),
parseMatch term "(x, y, z)" parseMatch term "(x, y, z)"
`(Pair (V "x" _) (Pair (V "y" _) (V "z" _) _) _), `(Pair (V "x" {}) (Pair (V "y" {}) (V "z" {}) _) _),
parseMatch term "((x, y), z)" parseMatch term "((x, y), z)"
`(Pair (Pair (V "x" _) (V "y" _) _) (V "z" _) _), `(Pair (Pair (V "x" {}) (V "y" {}) _) (V "z" {}) _),
parseMatch term "(f x, g @y)" parseMatch term "(f x, g @y)"
`(Pair (App (V "f" _) (V "x" _) _) (DApp (V "g" _) (V "y" _) _) _), `(Pair (App (V "f" {}) (V "x" {}) _) (DApp (V "g" {}) (V "y" {}) _) _),
parseMatch term "((x : A) × B, 0.(x : C) → D)" parseMatch term "((x : A) × B, 0.(x : C) → D)"
`(Pair (Sig (PV "x" _) (V "A" _) (V "B" _) _) `(Pair (Sig (PV "x" _) (V "A" {}) (V "B" {}) _)
(Pi (PQ Zero _) (PV "x" _) (V "C" _) (V "D" _) _) _), (Pi (PQ Zero _) (PV "x" _) (V "C" {}) (V "D" {}) _) _),
parseMatch term "(λ x ⇒ x, δ i ⇒ e @i)" parseMatch term "(λ x ⇒ x, δ i ⇒ e @i)"
`(Pair (Lam (PV "x" _) (V "x" _) _) `(Pair (Lam (PV "x" _) (V "x" {}) _)
(DLam (PV "i" _) (DApp (V "e" _) (V "i" _) _) _) _), (DLam (PV "i" _) (DApp (V "e" {}) (V "i" {}) _) _) _),
parseMatch term "(x,)" `(V "x" _), -- i GUESS parseMatch term "(x,)" `(V "x" {}), -- i GUESS
parseFails term "(,y)", parseFails term "(,y)",
parseFails term "(x,,y)" parseFails term "(x,,y)"
], ],
"equality type" :- [ "equality type" :- [
parseMatch term "Eq (i ⇒ A) s t" parseMatch term "Eq (i ⇒ A) s t"
`(Eq (PV "i" _, V "A" _) (V "s" _) (V "t" _) _), `(Eq (PV "i" _, V "A" {}) (V "s" {}) (V "t" {}) _),
parseMatch term "Eq (i ⇒ A (B @i)) (f x) (g y)" parseMatch term "Eq (i ⇒ A (B @i)) (f x) (g y)"
`(Eq (PV "i" _, App (V "A" _) (DApp (V "B" _) (V "i" _) _) _) `(Eq (PV "i" _, App (V "A" {}) (DApp (V "B" {}) (V "i" {}) _) _)
(App (V "f" _) (V "x" _) _) (App (V "f" {}) (V "x" {}) _)
(App (V "g" _) (V "y" _) _) _), (App (V "g" {}) (V "y" {}) _) _),
parseMatch term "Eq A s t" parseMatch term "Eq A s t"
`(Eq (Unused _, V "A" _) (V "s" _) (V "t" _) _), `(Eq (Unused _, V "A" {}) (V "s" {}) (V "t" {}) _),
parseMatch term "s ≡ t : A" parseMatch term "s ≡ t : A"
`(Eq (Unused _, V "A" _) (V "s" _) (V "t" _) _), `(Eq (Unused _, V "A" {}) (V "s" {}) (V "t" {}) _),
parseMatch term "s == t : A" parseMatch term "s == t : A"
`(Eq (Unused _, V "A" _) (V "s" _) (V "t" _) _), `(Eq (Unused _, V "A" {}) (V "s" {}) (V "t" {}) _),
parseMatch term "f x ≡ g y : A B" parseMatch term "f x ≡ g y : A B"
`(Eq (Unused _, App (V "A" _) (V "B" _) _) `(Eq (Unused _, App (V "A" {}) (V "B" {}) _)
(App (V "f" _) (V "x" _) _) (App (V "f" {}) (V "x" {}) _)
(App (V "g" _) (V "y" _) _) _), (App (V "g" {}) (V "y" {}) _) _),
parseMatch term "(A × B) ≡ (A' × B') : ★" parseMatch term "(A × B) ≡ (A' × B') : ★¹"
`(Eq (Unused _, TYPE 1 _) `(Eq (Unused _, TYPE 1 _)
(Sig (Unused _) (V "A" _) (V "B" _) _) (Sig (Unused _) (V "A" {}) (V "B" {}) _)
(Sig (Unused _) (V "A'" _) (V "B'" _) _) _), (Sig (Unused _) (V "A'" {}) (V "B'" {}) _) _),
note "A × (B ≡ A' × B' : ★)", note "A × (B ≡ A' × B' : ★¹)",
parseMatch term "A × B ≡ A' × B' : ★" parseMatch term "A × B ≡ A' × B' : ★¹"
`(Sig (Unused _) (V "A" _) `(Sig (Unused _) (V "A" {})
(Eq (Unused _, TYPE 1 _) (Eq (Unused _, TYPE 1 _)
(V "B" _) (Sig (Unused _) (V "A'" _) (V "B'" _) _) _) _), (V "B" {}) (Sig (Unused _) (V "A'" {}) (V "B'" {}) _) _) _),
parseFails term "Eq", parseFails term "Eq",
parseFails term "Eq s t", parseFails term "Eq s t",
parseFails term "s ≡ t", parseFails term "s ≡ t",
@ -263,7 +265,7 @@ tests = "parser" :- [
parseMatch term "" `(Nat _), parseMatch term "" `(Nat _),
parseMatch term "Nat" `(Nat _), parseMatch term "Nat" `(Nat _),
parseMatch term "zero" `(Zero _), parseMatch term "zero" `(Zero _),
parseMatch term "succ n" `(Succ (V "n" _) _), parseMatch term "succ n" `(Succ (V "n" {}) _),
parseMatch term "3" parseMatch term "3"
`(Succ (Succ (Succ (Zero _) _) _) _), `(Succ (Succ (Succ (Zero _) _) _) _),
parseMatch term "succ (succ 1)" parseMatch term "succ (succ 1)"
@ -278,7 +280,7 @@ tests = "parser" :- [
parseMatch term "[ω. × ]" parseMatch term "[ω. × ]"
`(BOX (PQ Any _) (Sig (Unused _) (Nat _) (Nat _) _) _), `(BOX (PQ Any _) (Sig (Unused _) (Nat _) (Nat _) _) _),
parseMatch term "[a]" parseMatch term "[a]"
`(Box (V "a" _) _), `(Box (V "a" {}) _),
parseMatch term "[0]" parseMatch term "[0]"
`(Box (Zero _) _), `(Box (Zero _) _),
parseMatch term "[1]" parseMatch term "[1]"
@ -287,28 +289,28 @@ tests = "parser" :- [
"coe" :- [ "coe" :- [
parseMatch term "coe A @p @q x" parseMatch term "coe A @p @q x"
`(Coe (Unused _, V "A" _) (V "p" _) (V "q" _) (V "x" _) _), `(Coe (Unused _, V "A" {}) (V "p" {}) (V "q" {}) (V "x" {}) _),
parseMatch term "coe (i ⇒ A) @p @q x" parseMatch term "coe (i ⇒ A) @p @q x"
`(Coe (PV "i" _, V "A" _) (V "p" _) (V "q" _) (V "x" _) _), `(Coe (PV "i" _, V "A" {}) (V "p" {}) (V "q" {}) (V "x" {}) _),
parseMatch term "coe A x" parseMatch term "coe A x"
`(Coe (Unused _, V "A" _) (K Zero _) (K One _) (V "x" _) _), `(Coe (Unused _, V "A" {}) (K Zero _) (K One _) (V "x" {}) _),
parseFails term "coe A @p @q", parseFails term "coe A @p @q",
parseFails term "coe (i ⇒ A) @p q x" parseFails term "coe (i ⇒ A) @p q x"
], ],
"comp" :- [ "comp" :- [
parseMatch term "comp A @p @q s @r { 0 𝑗 ⇒ s₀; 1 𝑘 ⇒ s₁ }" parseMatch term "comp A @p @q s @r { 0 𝑗 ⇒ s₀; 1 𝑘 ⇒ s₁ }"
`(Comp (Unused _, V "A" _) (V "p" _) (V "q" _) (V "s" _) (V "r" _) `(Comp (Unused _, V "A" {}) (V "p" {}) (V "q" {}) (V "s" {}) (V "r" {})
(PV "𝑗" _, V "s₀" _) (PV "𝑘" _, V "s₁" _) _), (PV "𝑗" _, V "s₀" {}) (PV "𝑘" _, V "s₁" {}) _),
parseMatch term "comp (𝑖 ⇒ A) @p @q s @r { 0 𝑗 ⇒ s₀; 1 𝑘 ⇒ s₁ }" parseMatch term "comp (𝑖 ⇒ A) @p @q s @r { 0 𝑗 ⇒ s₀; 1 𝑘 ⇒ s₁ }"
`(Comp (PV "𝑖" _, V "A" _) (V "p" _) (V "q" _) (V "s" _) (V "r" _) `(Comp (PV "𝑖" _, V "A" {}) (V "p" {}) (V "q" {}) (V "s" {}) (V "r" {})
(PV "𝑗" _, V "s₀" _) (PV "𝑘" _, V "s₁" _) _), (PV "𝑗" _, V "s₀" {}) (PV "𝑘" _, V "s₁" {}) _),
parseMatch term "comp A @p @q s @r { 1 𝑗 ⇒ s₀; 0 𝑘 ⇒ s₁; }" parseMatch term "comp A @p @q s @r { 1 𝑗 ⇒ s₀; 0 𝑘 ⇒ s₁; }"
`(Comp (Unused _, V "A" _) (V "p" _) (V "q" _) (V "s" _) (V "r" _) `(Comp (Unused _, V "A" {}) (V "p" {}) (V "q" {}) (V "s" {}) (V "r" {})
(PV "𝑘" _, V "s₁" _) (PV "𝑗" _, V "s₀" _) _), (PV "𝑘" _, V "s₁" {}) (PV "𝑗" _, V "s₀" {}) _),
parseMatch term "comp A s @r { 0 𝑗 ⇒ s₀; 1 𝑘 ⇒ s₁ }" parseMatch term "comp A s @r { 0 𝑗 ⇒ s₀; 1 𝑘 ⇒ s₁ }"
`(Comp (Unused _, V "A" _) (K Zero _) (K One _) (V "s" _) (V "r" _) `(Comp (Unused _, V "A" {}) (K Zero _) (K One _) (V "s" {}) (V "r" {})
(PV "𝑗" _, V "s₀" _) (PV "𝑘" _, V "s₁" _) _), (PV "𝑗" _, V "s₀" {}) (PV "𝑘" _, V "s₁" {}) _),
parseFails term "comp A @p @q s @r { 1 𝑗 ⇒ s₀; 1 𝑘 ⇒ s₁; }", parseFails term "comp A @p @q s @r { 1 𝑗 ⇒ s₀; 1 𝑘 ⇒ s₁; }",
parseFails term "comp A @p @q s @r { 0 𝑗 ⇒ s₀ }", parseFails term "comp A @p @q s @r { 0 𝑗 ⇒ s₀ }",
parseFails term "comp A @p @q s @r { }" parseFails term "comp A @p @q s @r { }"
@ -317,39 +319,39 @@ tests = "parser" :- [
"case" :- [ "case" :- [
parseMatch term parseMatch term
"case1 f s return x ⇒ A x of { (l, r) ⇒ r l }" "case1 f s return x ⇒ A x of { (l, r) ⇒ r l }"
`(Case (PQ One _) (App (V "f" _) (V "s" _) _) `(Case (PQ One _) (App (V "f" {}) (V "s" {}) _)
(PV "x" _, App (V "A" _) (V "x" _) _) (PV "x" _, App (V "A" {}) (V "x" {}) _)
(CasePair (PV "l" _, PV "r" _) (CasePair (PV "l" _, PV "r" _)
(App (V "r" _) (V "l" _) _) _) _), (App (V "r" {}) (V "l" {}) _) _) _),
parseMatch term parseMatch term
"case1 f s return x => A x of { (l, r) ⇒ r l; }" "case1 f s return x => A x of { (l, r) ⇒ r l; }"
`(Case (PQ One _) (App (V "f" _) (V "s" _) _) `(Case (PQ One _) (App (V "f" {}) (V "s" {}) _)
(PV "x" _, App (V "A" _) (V "x" _) _) (PV "x" _, App (V "A" {}) (V "x" {}) _)
(CasePair (PV "l" _, PV "r" _) (CasePair (PV "l" _, PV "r" _)
(App (V "r" _) (V "l" _) _) _) _), (App (V "r" {}) (V "l" {}) _) _) _),
parseMatch term parseMatch term
"case 1 . f s return x ⇒ A x of { (l, r) ⇒ r l }" "case 1 . f s return x ⇒ A x of { (l, r) ⇒ r l }"
`(Case (PQ One _) (App (V "f" _) (V "s" _) _) `(Case (PQ One _) (App (V "f" {}) (V "s" {}) _)
(PV "x" _, App (V "A" _) (V "x" _) _) (PV "x" _, App (V "A" {}) (V "x" {}) _)
(CasePair (PV "l" _, PV "r" _) (CasePair (PV "l" _, PV "r" _)
(App (V "r" _) (V "l" _) _) _) _), (App (V "r" {}) (V "l" {}) _) _) _),
parseMatch term parseMatch term
"case1 t return A of { 'x ⇒ p; 'y ⇒ q; 'z ⇒ r }" "case1 t return A of { 'x ⇒ p; 'y ⇒ q; 'z ⇒ r }"
`(Case (PQ One _) (V "t" _) `(Case (PQ One _) (V "t" {})
(Unused _, V "A" _) (Unused _, V "A" {})
(CaseEnum [(PT "x" _, V "p" _), (CaseEnum [(PT "x" _, V "p" {}),
(PT "y" _, V "q" _), (PT "y" _, V "q" {}),
(PT "z" _, V "r" _)] _) _), (PT "z" _, V "r" {})] _) _),
parseMatch term "caseω t return A of {}" parseMatch term "caseω t return A of {}"
`(Case (PQ Any _) (V "t" _) (Unused _, V "A" _) (CaseEnum [] _) _), `(Case (PQ Any _) (V "t" {}) (Unused _, V "A" {}) (CaseEnum [] _) _),
parseMatch term "case# t return A of {}" parseMatch term "case# t return A of {}"
`(Case (PQ Any _) (V "t" _) (Unused _, V "A" _) (CaseEnum [] _) _), `(Case (PQ Any _) (V "t" {}) (Unused _, V "A" {}) (CaseEnum [] _) _),
parseMatch term "caseω n return A of { 0 ⇒ a; succ n' ⇒ b }" parseMatch term "caseω n return A of { 0 ⇒ a; succ n' ⇒ b }"
`(Case (PQ Any _) (V "n" _) (Unused _, V "A" _) `(Case (PQ Any _) (V "n" {}) (Unused _, V "A" {})
(CaseNat (V "a" _) (PV "n'" _, PQ Zero _, Unused _, V "b" _) _) _), (CaseNat (V "a" {}) (PV "n'" _, PQ Zero _, Unused _, V "b" {}) _) _),
parseMatch term "caseω n return of { succ _, 1.ih ⇒ ih; zero ⇒ 0; }" parseMatch term "caseω n return of { succ _, 1.ih ⇒ ih; zero ⇒ 0; }"
`(Case (PQ Any _) (V "n" _) (Unused _, Nat _) `(Case (PQ Any _) (V "n" {}) (Unused _, Nat _)
(CaseNat (Zero _) (Unused _, PQ One _, PV "ih" _, V "ih" _) _) _), (CaseNat (Zero _) (Unused _, PQ One _, PV "ih" _, V "ih" {}) _) _),
parseFails term "caseω n return A of { zero ⇒ a }", parseFails term "caseω n return A of { zero ⇒ a }",
parseFails term "caseω n return of { succ ⇒ 5 }" parseFails term "caseω n return of { succ ⇒ 5 }"
], ],
@ -371,18 +373,18 @@ tests = "parser" :- [
`(MkPDef (PQ Any _) "x" `(MkPDef (PQ Any _) "x"
(Just (Sig (Unused _) (Enum ["a"] _) (Enum ["b"] _) _)) (Just (Sig (Unused _) (Enum ["a"] _) (Enum ["b"] _) _))
(Pair (Tag "a" _) (Tag "b" _) _) _), (Pair (Tag "a" _) (Tag "b" _) _) _),
parseMatch definition "def0 A : ★ = {a, b, c}" parseMatch definition "def0 A : ★ = {a, b, c}"
`(MkPDef (PQ Zero _) "A" (Just $ TYPE 0 _) `(MkPDef (PQ Zero _) "A" (Just $ TYPE 0 _)
(Enum ["a", "b", "c"] _) _) (Enum ["a", "b", "c"] _) _)
], ],
"top level" :- [ "top level" :- [
parseMatch input "def0 A : ★₀ = {}; def0 B : ★₁ = A;" parseMatch input "def0 A : ★⁰ = {}; def0 B : ★¹ = A;"
`([PD $ PDef $ MkPDef (PQ Zero _) "A" (Just $ TYPE 0 _) (Enum [] _) _, `([PD $ PDef $ MkPDef (PQ Zero _) "A" (Just $ TYPE 0 _) (Enum [] _) _,
PD $ PDef $ MkPDef (PQ Zero _) "B" (Just $ TYPE 1 _) (V "A" _) _]), PD $ PDef $ MkPDef (PQ Zero _) "B" (Just $ TYPE 1 _) (V "A" {}) _]),
parseMatch input "def0 A : ★₀ = {} def0 B : ★₁ = A" $ parseMatch input "def0 A : ★⁰ = {} def0 B : ★¹ = A" $
`([PD $ PDef $ MkPDef (PQ Zero _) "A" (Just $ TYPE 0 _) (Enum [] _) _, `([PD $ PDef $ MkPDef (PQ Zero _) "A" (Just $ TYPE 0 _) (Enum [] _) _,
PD $ PDef $ MkPDef (PQ Zero _) "B" (Just $ TYPE 1 _) (V "A" _) _]), PD $ PDef $ MkPDef (PQ Zero _) "B" (Just $ TYPE 1 _) (V "A" {}) _]),
note "empty input", note "empty input",
parsesAs input "" [], parsesAs input "" [],
parseFails input ";;;;;;;;;;;;;;;;;;;;;;;;;;", parseFails input ";;;;;;;;;;;;;;;;;;;;;;;;;;",
@ -401,10 +403,10 @@ tests = "parser" :- [
[PDef $ MkPDef (PQ Any _) "x" Nothing [PDef $ MkPDef (PQ Any _) "x" Nothing
(Ann (Tag "t" _) (Enum ["t"] _) _) _] _, (Ann (Tag "t" _) (Enum ["t"] _) _) _] _,
PD $ PDef $ MkPDef (PQ Any _) "y" Nothing PD $ PDef $ MkPDef (PQ Any _) "y" Nothing
(V (MakePName [< "a"] "x") _) _]), (V (MakePName [< "a"] "x") {}) _]),
parseMatch input #" load "a.quox"; def b = a.b "# parseMatch input #" load "a.quox"; def b = a.b "#
`([PLoad "a.quox" _, `([PLoad "a.quox" _,
PD $ PDef $ MkPDef (PQ Any _) "b" Nothing PD $ PDef $ MkPDef (PQ Any _) "b" Nothing
(V (MakePName [< "a"] "b") _) _]) (V (MakePName [< "a"] "b") {}) _])
] ]
] ]

View file

@ -35,36 +35,40 @@ export
tests : Test tests : Test
tests = "pretty printing terms" :- [ tests = "pretty printing terms" :- [
"free vars" :- [ "free vars" :- [
testPrettyE1 [<] [<] (^F "x") "x", testPrettyE1 [<] [<] (^F "x" 0) "x",
testPrettyE1 [<] [<] (^F (MakeName [< "A", "B", "C"] "x")) "A.B.C.x" testPrettyE [<] [<] (^F "x" 1) "" "x^1",
testPrettyE1 [<] [<] (^F (MakeName [< "A", "B", "C"] "x") 0) "A.B.C.x",
testPrettyE [<] [<] (^F (MakeName [< "A", "B", "C"] "x") 2)
"A.B.C.x²"
"A.B.C.x^2"
], ],
"bound vars" :- [ "bound vars" :- [
testPrettyE1 [< "𝑖", "𝑗"] [< "x", "y"] (^BV 0) "y", testPrettyE1 [< "𝑖", "𝑗"] [< "x", "y"] (^BV 0) "y",
testPrettyE1 [< "𝑖", "𝑗"] [< "x", "y"] (^BV 1) "x", testPrettyE1 [< "𝑖", "𝑗"] [< "x", "y"] (^BV 1) "x",
testPrettyE1 [< "𝑖", "𝑗"] [< "x", "y"] testPrettyE1 [< "𝑖", "𝑗"] [< "x", "y"]
(^DApp (^F "eq") (^BV 1)) (^DApp (^F "eq" 0) (^BV 1))
"eq @𝑖", "eq @𝑖",
testPrettyE1 [< "𝑖", "𝑗"] [< "x", "y"] testPrettyE1 [< "𝑖", "𝑗"] [< "x", "y"]
(^DApp (^DApp (^F "eq") (^BV 1)) (^BV 0)) (^DApp (^DApp (^F "eq" 0) (^BV 1)) (^BV 0))
"eq @𝑖 @𝑗" "eq @𝑖 @𝑗"
], ],
"applications" :- [ "applications" :- [
testPrettyE1 [<] [<] testPrettyE1 [<] [<]
(^App (^F "f") (^FT "x")) (^App (^F "f" 0) (^FT "x" 0))
"f x", "f x",
testPrettyE1 [<] [<] testPrettyE1 [<] [<]
(^App (^App (^F "f") (^FT "x")) (^FT "y")) (^App (^App (^F "f" 0) (^FT "x" 0)) (^FT "y" 0))
"f x y", "f x y",
testPrettyE1 [<] [<] testPrettyE1 [<] [<]
(^DApp (^F "f") (^K Zero)) (^DApp (^F "f" 0) (^K Zero))
"f @0", "f @0",
testPrettyE1 [<] [<] testPrettyE1 [<] [<]
(^DApp (^App (^F "f") (^FT "x")) (^K Zero)) (^DApp (^App (^F "f" 0) (^FT "x" 0)) (^K Zero))
"f x @0", "f x @0",
testPrettyE1 [<] [<] testPrettyE1 [<] [<]
(^App (^DApp (^F "g") (^K One)) (^FT "y")) (^App (^DApp (^F "g" 0) (^K One)) (^FT "y" 0))
"g @1 y" "g @1 y"
], ],
@ -74,7 +78,7 @@ tests = "pretty printing terms" :- [
"λ x ⇒ x" "λ x ⇒ x"
"fun x => x", "fun x => x",
testPrettyT [<] [<] testPrettyT [<] [<]
(^LamN (^FT "a")) (^LamN (^FT "a" 0))
"λ _ ⇒ a" "λ _ ⇒ a"
"fun _ => a", "fun _ => a",
testPrettyT [<] [< "y"] testPrettyT [<] [< "y"]
@ -87,11 +91,11 @@ tests = "pretty printing terms" :- [
"λ x y f ⇒ f x y" "λ x y f ⇒ f x y"
"fun x y f => f x y", "fun x y f => f x y",
testPrettyT [<] [<] testPrettyT [<] [<]
(^DLam (SN (^FT "a"))) (^DLam (SN (^FT "a" 0)))
"δ _ ⇒ a" "δ _ ⇒ a"
"dfun _ => a", "dfun _ => a",
testPrettyT [<] [<] testPrettyT [<] [<]
(^DLamY "i" (^FT "x")) (^DLamY "i" (^FT "x" 0))
"δ i ⇒ x" "δ i ⇒ x"
"dfun i => x", "dfun i => x",
testPrettyT [<] [<] testPrettyT [<] [<]
@ -101,51 +105,51 @@ tests = "pretty printing terms" :- [
], ],
"type universes" :- [ "type universes" :- [
testPrettyT [<] [<] (^TYPE 0) "" "Type 0", testPrettyT [<] [<] (^TYPE 0) "" "Type 0",
testPrettyT [<] [<] (^TYPE 100) "₁₀₀" "Type 100" testPrettyT [<] [<] (^TYPE 100) "¹⁰⁰" "Type 100"
], ],
"function types" :- [ "function types" :- [
testPrettyT [<] [<] testPrettyT [<] [<]
(^Arr One (^FT "A") (^FT "B")) (^Arr One (^FT "A" 0) (^FT "B" 0))
"1.A → B" "1.A → B"
"1.A -> B", "1.A -> B",
testPrettyT [<] [<] testPrettyT [<] [<]
(^PiY One "x" (^FT "A") (E $ ^App (^F "B") (^BVT 0))) (^PiY One "x" (^FT "A" 0) (E $ ^App (^F "B" 0) (^BVT 0)))
"1.(x : A) → B x" "1.(x : A) → B x"
"1.(x : A) -> B x", "1.(x : A) -> B x",
testPrettyT [<] [<] testPrettyT [<] [<]
(^PiY Zero "A" (^TYPE 0) (^Arr Any (^BVT 0) (^BVT 0))) (^PiY Zero "A" (^TYPE 0) (^Arr Any (^BVT 0) (^BVT 0)))
"0.(A : ★) → ω.A → A" "0.(A : ★) → ω.A → A"
"0.(A : Type 0) -> #.A -> A", "0.(A : Type 0) -> #.A -> A",
testPrettyT [<] [<] testPrettyT [<] [<]
(^Arr Any (^Arr Any (^FT "A") (^FT "A")) (^FT "A")) (^Arr Any (^Arr Any (^FT "A" 0) (^FT "A" 0)) (^FT "A" 0))
"ω.(ω.A → A) → A" "ω.(ω.A → A) → A"
"#.(#.A -> A) -> A", "#.(#.A -> A) -> A",
testPrettyT [<] [<] testPrettyT [<] [<]
(^Arr Any (^FT "A") (^Arr Any (^FT "A") (^FT "A"))) (^Arr Any (^FT "A" 0) (^Arr Any (^FT "A" 0) (^FT "A" 0)))
"ω.A → ω.A → A" "ω.A → ω.A → A"
"#.A -> #.A -> A", "#.A -> #.A -> A",
testPrettyT [<] [<] testPrettyT [<] [<]
(^PiY Zero "P" (^Arr Zero (^FT "A") (^TYPE 0)) (^PiY Zero "P" (^Arr Zero (^FT "A" 0) (^TYPE 0))
(E $ ^App (^BV 0) (^FT "a"))) (E $ ^App (^BV 0) (^FT "a" 0)))
"0.(P : 0.A → ★) → P a" "0.(P : 0.A → ★) → P a"
"0.(P : 0.A -> Type 0) -> P a" "0.(P : 0.A -> Type 0) -> P a"
], ],
"pair types" :- [ "pair types" :- [
testPrettyT [<] [<] testPrettyT [<] [<]
(^And (^FT "A") (^FT "B")) (^And (^FT "A" 0) (^FT "B" 0))
"A × B" "A × B"
"A ** B", "A ** B",
testPrettyT [<] [<] testPrettyT [<] [<]
(^SigY "x" (^FT "A") (E $ ^App (^F "B") (^BVT 0))) (^SigY "x" (^FT "A" 0) (E $ ^App (^F "B" 0) (^BVT 0)))
"(x : A) × B x" "(x : A) × B x"
"(x : A) ** B x", "(x : A) ** B x",
testPrettyT [<] [<] testPrettyT [<] [<]
(^SigY "x" (^FT "A") (^SigY "x" (^FT "A" 0)
(^SigY "y" (E $ ^App (^F "B") (^BVT 0)) (^SigY "y" (E $ ^App (^F "B" 0) (^BVT 0))
(E $ ^App (^App (^F "C") (^BVT 1)) (^BVT 0)))) (E $ ^App (^App (^F "C" 0) (^BVT 1)) (^BVT 0))))
"(x : A) × (y : B x) × C x y" "(x : A) × (y : B x) × C x y"
"(x : A) ** (y : B x) ** C x y", "(x : A) ** (y : B x) ** C x y",
todo "non-dependent, left and right nested" todo "non-dependent, left and right nested"
@ -153,16 +157,16 @@ tests = "pretty printing terms" :- [
"pairs" :- [ "pairs" :- [
testPrettyT1 [<] [<] testPrettyT1 [<] [<]
(^Pair (^FT "A") (^FT "B")) (^Pair (^FT "A" 0) (^FT "B" 0))
"(A, B)", "(A, B)",
testPrettyT1 [<] [<] testPrettyT1 [<] [<]
(^Pair (^FT "A") (^Pair (^FT "B") (^FT "C"))) (^Pair (^FT "A" 0) (^Pair (^FT "B" 0) (^FT "C" 0)))
"(A, B, C)", "(A, B, C)",
testPrettyT1 [<] [<] testPrettyT1 [<] [<]
(^Pair (^Pair (^FT "A") (^FT "B")) (^FT "C")) (^Pair (^Pair (^FT "A" 0) (^FT "B" 0)) (^FT "C" 0))
"((A, B), C)", "((A, B), C)",
testPrettyT [<] [<] testPrettyT [<] [<]
(^Pair (^LamY "x" (^BVT 0)) (^Arr One (^FT "B₁") (^FT "B₂"))) (^Pair (^LamY "x" (^BVT 0)) (^Arr One (^FT "B₁" 0) (^FT "B₂" 0)))
"(λ x ⇒ x, 1.B₁ → B₂)" "(λ x ⇒ x, 1.B₁ → B₂)"
"(fun x => x, 1.B₁ -> B₂)" "(fun x => x, 1.B₁ -> B₂)"
], ],
@ -188,12 +192,12 @@ tests = "pretty printing terms" :- [
"case" :- [ "case" :- [
testPrettyE [<] [<] testPrettyE [<] [<]
(^CasePair One (^F "a") (SN $ ^TYPE 1) (SN $ ^TYPE 0)) (^CasePair One (^F "a" 0) (SN $ ^TYPE 1) (SN $ ^TYPE 0))
"case1 a return ★₁ of { (_, _) ⇒ ★₀ }" "case1 a return ★¹ of { (_, _) ⇒ ★⁰ }"
"case1 a return Type 1 of { (_, _) => Type 0 }", "case1 a return Type 1 of { (_, _) => Type 0 }",
testPrettyT [<] [<] testPrettyT [<] [<]
(^LamY "u" (E $ (^LamY "u" (E $
^CaseEnum One (^F "u") ^CaseEnum One (^F "u" 0)
(SY [< "x"] $ ^Eq0 (^enum ["tt"]) (^BVT 0) (^Tag "tt")) (SY [< "x"] $ ^Eq0 (^enum ["tt"]) (^BVT 0) (^Tag "tt"))
(fromList [("tt", ^DLamN (^Tag "tt"))]))) (fromList [("tt", ^DLamN (^Tag "tt"))])))
"λ u ⇒ case1 u return x ⇒ x ≡ 'tt : {tt} of { 'tt ⇒ δ _ ⇒ 'tt }" "λ u ⇒ case1 u return x ⇒ x ≡ 'tt : {tt} of { 'tt ⇒ δ _ ⇒ 'tt }"
@ -205,32 +209,32 @@ tests = "pretty printing terms" :- [
"type-case" :- [ "type-case" :- [
testPrettyE [<] [<] testPrettyE [<] [<]
{label = "type-case ∷ ★₀ return ★₀ of { ⋯ }"} {label = "type-case ∷ ★⁰ return ★⁰ of { ⋯ }"}
(^TypeCase (^Ann (^Nat) (^TYPE 0)) (^TYPE 0) empty (^Nat)) (^TypeCase (^Ann (^Nat) (^TYPE 0)) (^TYPE 0) empty (^Nat))
"type-case ∷ ★₀ return ★₀ of { _ ⇒ }" "type-case ∷ ★⁰ return ★⁰ of { _ ⇒ }"
"type-case Nat :: Type 0 return Type 0 of { _ => Nat }" "type-case Nat :: Type 0 return Type 0 of { _ => Nat }"
], ],
"annotations" :- [ "annotations" :- [
testPrettyE [<] [<] testPrettyE [<] [<]
(^Ann (^FT "a") (^FT "A")) (^Ann (^FT "a" 0) (^FT "A" 0))
"a ∷ A" "a ∷ A"
"a :: A", "a :: A",
testPrettyE [<] [<] testPrettyE [<] [<]
(^Ann (^FT "a") (E $ ^Ann (^FT "A") (^FT "𝐀"))) (^Ann (^FT "a" 0) (E $ ^Ann (^FT "A" 0) (^FT "𝐀" 0)))
"a ∷ A ∷ 𝐀" "a ∷ A ∷ 𝐀"
"a :: A :: 𝐀", "a :: A :: 𝐀",
testPrettyE [<] [<] testPrettyE [<] [<]
(^Ann (E $ ^Ann (^FT "α") (^FT "a")) (^FT "A")) (^Ann (E $ ^Ann (^FT "α" 0) (^FT "a" 0)) (^FT "A" 0))
"(α ∷ a) ∷ A" "(α ∷ a) ∷ A"
"(α :: a) :: A", "(α :: a) :: A",
testPrettyE [<] [<] testPrettyE [<] [<]
(^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A") (^FT "A"))) (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A" 0) (^FT "A" 0)))
"(λ x ⇒ x) ∷ 1.A → A" "(λ x ⇒ x) ∷ 1.A → A"
"(fun x => x) :: 1.A -> A", "(fun x => x) :: 1.A -> A",
testPrettyE [<] [<] testPrettyE [<] [<]
(^Ann (^Arr One (^FT "A") (^FT "A")) (^TYPE 7)) (^Ann (^Arr One (^FT "A" 0) (^FT "A" 0)) (^TYPE 7))
"(1.A → A) ∷ ★" "(1.A → A) ∷ ★"
"(1.A -> A) :: Type 7" "(1.A -> A) :: Type 7"
] ]
] ]

View file

@ -11,7 +11,7 @@ import Control.Eff
%hide Pretty.App %hide Pretty.App
parameters {0 isRedex : RedexTest tm} {auto _ : Whnf tm isRedex} {d, n : Nat} parameters {0 isRedex : RedexTest tm} {auto _ : CanWhnf tm isRedex} {d, n : Nat}
{auto _ : (Eq (tm d n), Show (tm d n))} {auto _ : (Eq (tm d n), Show (tm d n))}
{default empty defs : Definitions} {default empty defs : Definitions}
private private
@ -35,42 +35,42 @@ tests = "whnf" :- [
"head constructors" :- [ "head constructors" :- [
testNoStep "★₀" empty $ ^TYPE 0, testNoStep "★₀" empty $ ^TYPE 0,
testNoStep "1.A → B" empty $ testNoStep "1.A → B" empty $
^Arr One (^FT "A") (^FT "B"), ^Arr One (^FT "A" 0) (^FT "B" 0),
testNoStep "(x: A) ⊸ B x" empty $ testNoStep "(x: A) ⊸ B x" empty $
^PiY One "x" (^FT "A") (E $ ^App (^F "B") (^BVT 0)), ^PiY One "x" (^FT "A" 0) (E $ ^App (^F "B" 0) (^BVT 0)),
testNoStep "λ x ⇒ x" empty $ testNoStep "λ x ⇒ x" empty $
^LamY "x" (^BVT 0), ^LamY "x" (^BVT 0),
testNoStep "f a" empty $ testNoStep "f a" empty $
E $ ^App (^F "f") (^FT "a") E $ ^App (^F "f" 0) (^FT "a" 0)
], ],
"neutrals" :- [ "neutrals" :- [
testNoStep "x" (ctx [< ("A", ^Nat)]) $ ^BV 0, testNoStep "x" (ctx [< ("A", ^Nat)]) $ ^BV 0,
testNoStep "a" empty $ ^F "a", testNoStep "a" empty $ ^F "a" 0,
testNoStep "f a" empty $ ^App (^F "f") (^FT "a"), testNoStep "f a" empty $ ^App (^F "f" 0) (^FT "a" 0),
testNoStep "★₀ ∷ ★₁" empty $ ^Ann (^TYPE 0) (^TYPE 1) testNoStep "★₀ ∷ ★₁" empty $ ^Ann (^TYPE 0) (^TYPE 1)
], ],
"redexes" :- [ "redexes" :- [
testWhnf "a ∷ A" empty testWhnf "a ∷ A" empty
(^Ann (^FT "a") (^FT "A")) (^Ann (^FT "a" 0) (^FT "A" 0))
(^F "a"), (^F "a" 0),
testWhnf "★₁ ∷ ★₃" empty testWhnf "★₁ ∷ ★₃" empty
(E $ ^Ann (^TYPE 1) (^TYPE 3)) (E $ ^Ann (^TYPE 1) (^TYPE 3))
(^TYPE 1), (^TYPE 1),
testWhnf "(λ x ⇒ x ∷ 1.A → A) a" empty testWhnf "(λ x ⇒ x ∷ 1.A → A) a" empty
(^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A") (^FT "A"))) (^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A" 0) (^FT "A" 0)))
(^FT "a")) (^FT "a" 0))
(^F "a") (^F "a" 0)
], ],
"definitions" :- [ "definitions" :- [
testWhnf "a (transparent)" empty testWhnf "a (transparent)" empty
{defs = fromList [("a", ^mkDef gzero (^TYPE 1) (^TYPE 0))]} {defs = fromList [("a", ^mkDef gzero (^TYPE 1) (^TYPE 0))]}
(^F "a") (^Ann (^TYPE 0) (^TYPE 1)), (^F "a" 0) (^Ann (^TYPE 0) (^TYPE 1)),
testNoStep "a (opaque)" empty testNoStep "a (opaque)" empty
{defs = fromList [("a", ^mkPostulate gzero (^TYPE 1))]} {defs = fromList [("a", ^mkPostulate gzero (^TYPE 1))]}
(^F "a") (^F "a" 0)
], ],
"elim closure" :- [ "elim closure" :- [
@ -78,56 +78,56 @@ tests = "whnf" :- [
(CloE (Sub (^BV 0) id)) (CloE (Sub (^BV 0) id))
(^BV 0), (^BV 0),
testWhnf "x{a/x}" empty testWhnf "x{a/x}" empty
(CloE (Sub (^BV 0) (^F "a" ::: id))) (CloE (Sub (^BV 0) (^F "a" 0 ::: id)))
(^F "a"), (^F "a" 0),
testWhnf "x{a/y}" (ctx [< ("x", ^Nat)]) testWhnf "x{a/y}" (ctx [< ("x", ^Nat)])
(CloE (Sub (^BV 0) (^BV 0 ::: ^F "a" ::: id))) (CloE (Sub (^BV 0) (^BV 0 ::: ^F "a" 0 ::: id)))
(^BV 0), (^BV 0),
testWhnf "x{(y{a/y})/x}" empty testWhnf "x{(y{a/y})/x}" empty
(CloE (Sub (^BV 0) ((CloE (Sub (^BV 0) (^F "a" ::: id))) ::: id))) (CloE (Sub (^BV 0) ((CloE (Sub (^BV 0) (^F "a" 0 ::: id))) ::: id)))
(^F "a"), (^F "a" 0),
testWhnf "(x y){f/x,a/y}" empty testWhnf "(x y){f/x,a/y}" empty
(CloE (Sub (^App (^BV 0) (^BVT 1)) (^F "f" ::: ^F "a" ::: id))) (CloE (Sub (^App (^BV 0) (^BVT 1)) (^F "f" 0 ::: ^F "a" 0 ::: id)))
(^App (^F "f") (^FT "a")), (^App (^F "f" 0) (^FT "a" 0)),
testWhnf "(y ∷ x){A/x}" (ctx [< ("x", ^Nat)]) testWhnf "(y ∷ x){A/x}" (ctx [< ("x", ^Nat)])
(CloE (Sub (^Ann (^BVT 1) (^BVT 0)) (^F "A" ::: id))) (CloE (Sub (^Ann (^BVT 1) (^BVT 0)) (^F "A" 0 ::: id)))
(^BV 0), (^BV 0),
testWhnf "(y ∷ x){A/x,a/y}" empty testWhnf "(y ∷ x){A/x,a/y}" empty
(CloE (Sub (^Ann (^BVT 1) (^BVT 0)) (^F "A" ::: ^F "a" ::: id))) (CloE (Sub (^Ann (^BVT 1) (^BVT 0)) (^F "A" 0 ::: ^F "a" 0 ::: id)))
(^F "a") (^F "a" 0)
], ],
"term closure" :- [ "term closure" :- [
testWhnf "(λ y ⇒ x){a/x}" empty testWhnf "(λ y ⇒ x){a/x}" empty
(CloT (Sub (^LamN (^BVT 0)) (^F "a" ::: id))) (CloT (Sub (^LamN (^BVT 0)) (^F "a" 0 ::: id)))
(^LamN (^FT "a")), (^LamN (^FT "a" 0)),
testWhnf "(λy. y){a/x}" empty testWhnf "(λy. y){a/x}" empty
(CloT (Sub (^LamY "y" (^BVT 0)) (^F "a" ::: id))) (CloT (Sub (^LamY "y" (^BVT 0)) (^F "a" 0 ::: id)))
(^LamY "y" (^BVT 0)) (^LamY "y" (^BVT 0))
], ],
"looking inside `E`" :- [ "looking inside `E`" :- [
testWhnf "(λx. x ∷ A ⊸ A) a" empty testWhnf "(λx. x ∷ A ⊸ A) a" empty
(E $ ^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A") (^FT "A"))) (E $ ^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A" 0) (^FT "A" 0)))
(^FT "a")) (^FT "a" 0))
(^FT "a") (^FT "a" 0)
], ],
"nested redex" :- [ "nested redex" :- [
testNoStep "λ y ⇒ ((λ x ⇒ x) ∷ 1.A → A) y" empty $ testNoStep "λ y ⇒ ((λ x ⇒ x) ∷ 1.A → A) y" empty $
^LamY "y" (E $ ^LamY "y" (E $
^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A") (^FT "A"))) ^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A" 0) (^FT "A" 0)))
(^BVT 0)), (^BVT 0)),
testNoStep "f (((λ x ⇒ x) ∷ 1.A → A) a)" empty $ testNoStep "f (((λ x ⇒ x) ∷ 1.A → A) a)" empty $
^App (^F "f") ^App (^F "f" 0)
(E $ ^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A") (^FT "A"))) (E $ ^App (^Ann (^LamY "x" (^BVT 0)) (^Arr One (^FT "A" 0) (^FT "A" 0)))
(^FT "a")), (^FT "a" 0)),
testNoStep "λx. (y x){x/x,a/y}" (ctx [< ("y", ^Nat)]) $ testNoStep "λx. (y x){x/x,a/y}" (ctx [< ("y", ^Nat)]) $
^LamY "x" (CloT $ Sub (E $ ^App (^BV 1) (^BVT 0)) ^LamY "x" (CloT $ Sub (E $ ^App (^BV 1) (^BVT 0))
(^BV 0 ::: ^F "a" ::: id)), (^BV 0 ::: ^F "a" 0 ::: id)),
testNoStep "f (y x){x/x,a/y}" (ctx [< ("y", ^Nat)]) $ testNoStep "f (y x){x/x,a/y}" (ctx [< ("y", ^Nat)]) $
^App (^F "f") ^App (^F "f" 0)
(CloT (Sub (E $ ^App (^BV 1) (^BVT 0)) (CloT (Sub (E $ ^App (^BV 1) (^BVT 0))
(^BV 0 ::: ^F "a" ::: id))) (^BV 0 ::: ^F "a" 0 ::: id)))
] ]
] ]

View file

@ -49,8 +49,8 @@ reflDef = ^LamY "A" (^LamY "x" (^DLamY "i" (^BVT 0)))
fstTy : Term d n fstTy : Term d n
fstTy = fstTy =
^PiY Zero "A" (^TYPE 1) ^PiY Zero "A" (^TYPE 0)
(^PiY Zero "B" (^Arr Any (^BVT 0) (^TYPE 1)) (^PiY Zero "B" (^Arr Any (^BVT 0) (^TYPE 0))
(^Arr Any (^SigY "x" (^BVT 1) (E $ ^App (^BV 1) (^BVT 0))) (^BVT 1))) (^Arr Any (^SigY "x" (^BVT 1) (E $ ^App (^BV 1) (^BVT 0))) (^BVT 1)))
fstDef : Term d n fstDef : Term d n
@ -61,11 +61,11 @@ fstDef =
sndTy : Term d n sndTy : Term d n
sndTy = sndTy =
^PiY Zero "A" (^TYPE 1) ^PiY Zero "A" (^TYPE 0)
(^PiY Zero "B" (^Arr Any (^BVT 0) (^TYPE 1)) (^PiY Zero "B" (^Arr Any (^BVT 0) (^TYPE 0))
(^PiY Any "p" (^SigY "x" (^BVT 1) (E $ ^App (^BV 1) (^BVT 0))) (^PiY Any "p" (^SigY "x" (^BVT 1) (E $ ^App (^BV 1) (^BVT 0)))
(E $ ^App (^BV 1) (E $ ^App (^BV 1)
(E $ ^App (^App (^App (^F "fst") (^BVT 2)) (^BVT 1)) (^BVT 0))))) (E $ ^App (^App (^App (^F "fst" 0) (^BVT 2)) (^BVT 1)) (^BVT 0)))))
sndDef : Term d n sndDef : Term d n
sndDef = sndDef =
@ -74,12 +74,15 @@ sndDef =
(E $ ^CasePair Any (^BV 0) (E $ ^CasePair Any (^BV 0)
(SY [< "p"] $ E $ (SY [< "p"] $ E $
^App (^BV 2) ^App (^BV 2)
(E $ ^App (^App (^App (^F "fst") (^BVT 3)) (^BVT 2)) (^BVT 0))) (E $ ^App (^App (^App (^F "fst" 0) (^BVT 3)) (^BVT 2)) (^BVT 0)))
(SY [< "x", "y"] $ ^BVT 0)))) (SY [< "x", "y"] $ ^BVT 0))))
nat : Term d n nat : Term d n
nat = ^Nat nat = ^Nat
apps : Elim d n -> List (Term d n) -> Elim d n
apps = foldl (\f, s => ^App f s)
defGlobals : Definitions defGlobals : Definitions
defGlobals = fromList defGlobals = fromList
@ -87,19 +90,21 @@ defGlobals = fromList
("B", ^mkPostulate gzero (^TYPE 0)), ("B", ^mkPostulate gzero (^TYPE 0)),
("C", ^mkPostulate gzero (^TYPE 1)), ("C", ^mkPostulate gzero (^TYPE 1)),
("D", ^mkPostulate gzero (^TYPE 1)), ("D", ^mkPostulate gzero (^TYPE 1)),
("P", ^mkPostulate gzero (^Arr Any (^FT "A") (^TYPE 0))), ("P", ^mkPostulate gzero (^Arr Any (^FT "A" 0) (^TYPE 0))),
("a", ^mkPostulate gany (^FT "A")), ("a", ^mkPostulate gany (^FT "A" 0)),
("a'", ^mkPostulate gany (^FT "A")), ("a'", ^mkPostulate gany (^FT "A" 0)),
("b", ^mkPostulate gany (^FT "B")), ("b", ^mkPostulate gany (^FT "B" 0)),
("f", ^mkPostulate gany (^Arr One (^FT "A") (^FT "A"))), ("c", ^mkPostulate gany (^FT "C" 0)),
("", ^mkPostulate gany (^Arr Any (^FT "A") (^FT "A"))), ("d", ^mkPostulate gany (^FT "D" 0)),
("g", ^mkPostulate gany (^Arr One (^FT "A") (^FT "B"))), ("f", ^mkPostulate gany (^Arr One (^FT "A" 0) (^FT "A" 0))),
("", ^mkPostulate gany (^Arr Any (^FT "A" 0) (^FT "A" 0))),
("g", ^mkPostulate gany (^Arr One (^FT "A" 0) (^FT "B" 0))),
("f2", ^mkPostulate gany ("f2", ^mkPostulate gany
(^Arr One (^FT "A") (^Arr One (^FT "A") (^FT "B")))), (^Arr One (^FT "A" 0) (^Arr One (^FT "A" 0) (^FT "B" 0)))),
("p", ^mkPostulate gany ("p", ^mkPostulate gany
(^PiY One "x" (^FT "A") (E $ ^App (^F "P") (^BVT 0)))), (^PiY One "x" (^FT "A" 0) (E $ ^App (^F "P" 0) (^BVT 0)))),
("q", ^mkPostulate gany ("q", ^mkPostulate gany
(^PiY One "x" (^FT "A") (E $ ^App (^F "P") (^BVT 0)))), (^PiY One "x" (^FT "A" 0) (E $ ^App (^F "P" 0) (^BVT 0)))),
("refl", ^mkDef gany reflTy reflDef), ("refl", ^mkDef gany reflTy reflDef),
("fst", ^mkDef gany fstTy fstDef), ("fst", ^mkDef gany fstTy fstDef),
("snd", ^mkDef gany sndTy sndDef)] ("snd", ^mkDef gany sndTy sndDef)]
@ -180,36 +185,36 @@ tests = "typechecker" :- [
"function types" :- [ "function types" :- [
note "A, B : ★₀; C, D : ★₁; P : 0.A → ★₀", note "A, B : ★₀; C, D : ★₁; P : 0.A → ★₀",
testTC "0 · 1.A → B ⇐ ★₀" $ testTC "0 · 1.A → B ⇐ ★₀" $
check_ empty szero (^Arr One (^FT "A") (^FT "B")) (^TYPE 0), check_ empty szero (^Arr One (^FT "A" 0) (^FT "B" 0)) (^TYPE 0),
note "subtyping", note "subtyping",
testTC "0 · 1.A → B ⇐ ★₁" $ testTC "0 · 1.A → B ⇐ ★₁" $
check_ empty szero (^Arr One (^FT "A") (^FT "B")) (^TYPE 1), check_ empty szero (^Arr One (^FT "A" 0) (^FT "B" 0)) (^TYPE 1),
testTC "0 · 1.C → D ⇐ ★₁" $ testTC "0 · 1.C → D ⇐ ★₁" $
check_ empty szero (^Arr One (^FT "C") (^FT "D")) (^TYPE 1), check_ empty szero (^Arr One (^FT "C" 0) (^FT "D" 0)) (^TYPE 1),
testTCFail "0 · 1.C → D ⇍ ★₀" $ testTCFail "0 · 1.C → D ⇍ ★₀" $
check_ empty szero (^Arr One (^FT "C") (^FT "D")) (^TYPE 0), check_ empty szero (^Arr One (^FT "C" 0) (^FT "D" 0)) (^TYPE 0),
testTC "0 · 1.(x : A) → P x ⇐ ★₀" $ testTC "0 · 1.(x : A) → P x ⇐ ★₀" $
check_ empty szero check_ empty szero
(^PiY One "x" (^FT "A") (E $ ^App (^F "P") (^BVT 0))) (^PiY One "x" (^FT "A" 0) (E $ ^App (^F "P" 0) (^BVT 0)))
(^TYPE 0), (^TYPE 0),
testTCFail "0 · 1.A → P ⇍ ★₀" $ testTCFail "0 · 1.A → P ⇍ ★₀" $
check_ empty szero (^Arr One (^FT "A") (^FT "P")) (^TYPE 0), check_ empty szero (^Arr One (^FT "A" 0) (^FT "P" 0)) (^TYPE 0),
testTC "0=1 ⊢ 0 · 1.A → P ⇐ ★₀" $ testTC "0=1 ⊢ 0 · 1.A → P ⇐ ★₀" $
check_ empty01 szero (^Arr One (^FT "A") (^FT "P")) (^TYPE 0) check_ empty01 szero (^Arr One (^FT "A" 0) (^FT "P" 0)) (^TYPE 0)
], ],
"pair types" :- [ "pair types" :- [
testTC "0 · A × A ⇐ ★₀" $ testTC "0 · A × A ⇐ ★₀" $
check_ empty szero (^And (^FT "A") (^FT "A")) (^TYPE 0), check_ empty szero (^And (^FT "A" 0) (^FT "A" 0)) (^TYPE 0),
testTCFail "0 · A × P ⇍ ★₀" $ testTCFail "0 · A × P ⇍ ★₀" $
check_ empty szero (^And (^FT "A") (^FT "P")) (^TYPE 0), check_ empty szero (^And (^FT "A" 0) (^FT "P" 0)) (^TYPE 0),
testTC "0 · (x : A) × P x ⇐ ★₀" $ testTC "0 · (x : A) × P x ⇐ ★₀" $
check_ empty szero check_ empty szero
(^SigY "x" (^FT "A") (E $ ^App (^F "P") (^BVT 0))) (^SigY "x" (^FT "A" 0) (E $ ^App (^F "P" 0) (^BVT 0)))
(^TYPE 0), (^TYPE 0),
testTC "0 · (x : A) × P x ⇐ ★₁" $ testTC "0 · (x : A) × P x ⇐ ★₁" $
check_ empty szero check_ empty szero
(^SigY "x" (^FT "A") (E $ ^App (^F "P") (^BVT 0))) (^SigY "x" (^FT "A" 0) (E $ ^App (^F "P" 0) (^BVT 0)))
(^TYPE 1), (^TYPE 1),
testTC "0 · (A : ★₀) × A ⇐ ★₁" $ testTC "0 · (A : ★₀) × A ⇐ ★₁" $
check_ empty szero check_ empty szero
@ -221,7 +226,7 @@ tests = "typechecker" :- [
(^TYPE 0), (^TYPE 0),
testTCFail "1 · A × A ⇍ ★₀" $ testTCFail "1 · A × A ⇍ ★₀" $
check_ empty sone check_ empty sone
(^And (^FT "A") (^FT "A")) (^And (^FT "A" 0) (^FT "A" 0))
(^TYPE 0) (^TYPE 0)
], ],
@ -239,64 +244,64 @@ tests = "typechecker" :- [
"free vars" :- [ "free vars" :- [
note "A : ★₀", note "A : ★₀",
testTC "0 · A ⇒ ★₀" $ testTC "0 · A ⇒ ★₀" $
inferAs empty szero (^F "A") (^TYPE 0), inferAs empty szero (^F "A" 0) (^TYPE 0),
testTC "0 · [A] ⇐ ★₀" $ testTC "0 · [A] ⇐ ★₀" $
check_ empty szero (^FT "A") (^TYPE 0), check_ empty szero (^FT "A" 0) (^TYPE 0),
note "subtyping", note "subtyping",
testTC "0 · [A] ⇐ ★₁" $ testTC "0 · [A] ⇐ ★₁" $
check_ empty szero (^FT "A") (^TYPE 1), check_ empty szero (^FT "A" 0) (^TYPE 1),
note "(fail) runtime-relevant type", note "(fail) runtime-relevant type",
testTCFail "1 · A ⇏ ★₀" $ testTCFail "1 · A ⇏ ★₀" $
infer_ empty sone (^F "A"), infer_ empty sone (^F "A" 0),
testTC "1 . f ⇒ 1.A → A" $ testTC "1 . f ⇒ 1.A → A" $
inferAs empty sone (^F "f") (^Arr One (^FT "A") (^FT "A")), inferAs empty sone (^F "f" 0) (^Arr One (^FT "A" 0) (^FT "A" 0)),
testTC "1 . f ⇐ 1.A → A" $ testTC "1 . f ⇐ 1.A → A" $
check_ empty sone (^FT "f") (^Arr One (^FT "A") (^FT "A")), check_ empty sone (^FT "f" 0) (^Arr One (^FT "A" 0) (^FT "A" 0)),
testTCFail "1 . f ⇍ 0.A → A" $ testTCFail "1 . f ⇍ 0.A → A" $
check_ empty sone (^FT "f") (^Arr Zero (^FT "A") (^FT "A")), check_ empty sone (^FT "f" 0) (^Arr Zero (^FT "A" 0) (^FT "A" 0)),
testTCFail "1 . f ⇍ ω.A → A" $ testTCFail "1 . f ⇍ ω.A → A" $
check_ empty sone (^FT "f") (^Arr Any (^FT "A") (^FT "A")), check_ empty sone (^FT "f" 0) (^Arr Any (^FT "A" 0) (^FT "A" 0)),
testTC "1 . (λ x ⇒ f x) ⇐ 1.A → A" $ testTC "1 . (λ x ⇒ f x) ⇐ 1.A → A" $
check_ empty sone check_ empty sone
(^LamY "x" (E $ ^App (^F "f") (^BVT 0))) (^LamY "x" (E $ ^App (^F "f" 0) (^BVT 0)))
(^Arr One (^FT "A") (^FT "A")), (^Arr One (^FT "A" 0) (^FT "A" 0)),
testTC "1 . (λ x ⇒ f x) ⇐ ω.A → A" $ testTC "1 . (λ x ⇒ f x) ⇐ ω.A → A" $
check_ empty sone check_ empty sone
(^LamY "x" (E $ ^App (^F "f") (^BVT 0))) (^LamY "x" (E $ ^App (^F "f" 0) (^BVT 0)))
(^Arr Any (^FT "A") (^FT "A")), (^Arr Any (^FT "A" 0) (^FT "A" 0)),
testTCFail "1 . (λ x ⇒ f x) ⇍ 0.A → A" $ testTCFail "1 . (λ x ⇒ f x) ⇍ 0.A → A" $
check_ empty sone check_ empty sone
(^LamY "x" (E $ ^App (^F "f") (^BVT 0))) (^LamY "x" (E $ ^App (^F "f" 0) (^BVT 0)))
(^Arr Zero (^FT "A") (^FT "A")), (^Arr Zero (^FT "A" 0) (^FT "A" 0)),
testTC "1 . fω ⇒ ω.A → A" $ testTC "1 . fω ⇒ ω.A → A" $
inferAs empty sone (^F "") (^Arr Any (^FT "A") (^FT "A")), inferAs empty sone (^F "" 0) (^Arr Any (^FT "A" 0) (^FT "A" 0)),
testTC "1 . (λ x ⇒ fω x) ⇐ ω.A → A" $ testTC "1 . (λ x ⇒ fω x) ⇐ ω.A → A" $
check_ empty sone check_ empty sone
(^LamY "x" (E $ ^App (^F "") (^BVT 0))) (^LamY "x" (E $ ^App (^F "" 0) (^BVT 0)))
(^Arr Any (^FT "A") (^FT "A")), (^Arr Any (^FT "A" 0) (^FT "A" 0)),
testTCFail "1 . (λ x ⇒ fω x) ⇍ 0.A → A" $ testTCFail "1 . (λ x ⇒ fω x) ⇍ 0.A → A" $
check_ empty sone check_ empty sone
(^LamY "x" (E $ ^App (^F "") (^BVT 0))) (^LamY "x" (E $ ^App (^F "" 0) (^BVT 0)))
(^Arr Zero (^FT "A") (^FT "A")), (^Arr Zero (^FT "A" 0) (^FT "A" 0)),
testTCFail "1 . (λ x ⇒ fω x) ⇍ 1.A → A" $ testTCFail "1 . (λ x ⇒ fω x) ⇍ 1.A → A" $
check_ empty sone check_ empty sone
(^LamY "x" (E $ ^App (^F "") (^BVT 0))) (^LamY "x" (E $ ^App (^F "" 0) (^BVT 0)))
(^Arr One (^FT "A") (^FT "A")), (^Arr One (^FT "A" 0) (^FT "A" 0)),
note "refl : (0·A : ★₀) → (1·x : A) → (x ≡ x : A) ≔ (λ A x ⇒ δ _ ⇒ x)", note "refl : (0·A : ★₀) → (1·x : A) → (x ≡ x : A) ≔ (λ A x ⇒ δ _ ⇒ x)",
testTC "1 · refl ⇒ ⋯" $ inferAs empty sone (^F "refl") reflTy, testTC "1 · refl ⇒ ⋯" $ inferAs empty sone (^F "refl" 0) reflTy,
testTC "1 · [refl] ⇐ ⋯" $ check_ empty sone (^FT "refl") reflTy testTC "1 · [refl] ⇐ ⋯" $ check_ empty sone (^FT "refl" 0) reflTy
], ],
"bound vars" :- [ "bound vars" :- [
testTC "x : A ⊢ 1 · x ⇒ A ⊳ 1·x" $ testTC "x : A ⊢ 1 · x ⇒ A ⊳ 1·x" $
inferAsQ (ctx [< ("x", ^FT "A")]) sone inferAsQ (ctx [< ("x", ^FT "A" 0)]) sone
(^BV 0) (^FT "A") [< One], (^BV 0) (^FT "A" 0) [< One],
testTC "x : A ⊢ 1 · x ⇐ A ⊳ 1·x" $ testTC "x : A ⊢ 1 · x ⇐ A ⊳ 1·x" $
checkQ (ctx [< ("x", ^FT "A")]) sone (^BVT 0) (^FT "A") [< One], checkQ (ctx [< ("x", ^FT "A" 0)]) sone (^BVT 0) (^FT "A" 0) [< One],
note "f2 : 1.A → 1.A → B", note "f2 : 1.A → 1.A → B",
testTC "x : A ⊢ 1 · f2 x x ⇒ B ⊳ ω·x" $ testTC "x : A ⊢ 1 · f2 x x ⇒ B ⊳ ω·x" $
inferAsQ (ctx [< ("x", ^FT "A")]) sone inferAsQ (ctx [< ("x", ^FT "A" 0)]) sone
(^App (^App (^F "f2") (^BVT 0)) (^BVT 0)) (^FT "B") [< Any] (^App (^App (^F "f2" 0) (^BVT 0)) (^BVT 0)) (^FT "B" 0) [< Any]
], ],
"lambda" :- [ "lambda" :- [
@ -304,24 +309,25 @@ tests = "typechecker" :- [
testTC "1 · (λ x ⇒ x) ⇐ A → A" $ testTC "1 · (λ x ⇒ x) ⇐ A → A" $
check_ empty sone check_ empty sone
(^LamY "x" (^BVT 0)) (^LamY "x" (^BVT 0))
(^Arr One (^FT "A") (^FT "A")), (^Arr One (^FT "A" 0) (^FT "A" 0)),
testTC "1 · (λ x ⇒ x) ⇐ ω.A → A" $ testTC "1 · (λ x ⇒ x) ⇐ ω.A → A" $
check_ empty sone check_ empty sone
(^LamY "x" (^BVT 0)) (^LamY "x" (^BVT 0))
(^Arr Any (^FT "A") (^FT "A")), (^Arr Any (^FT "A" 0) (^FT "A" 0)),
note "(fail) zero binding used relevantly", note "(fail) zero binding used relevantly",
testTCFail "1 · (λ x ⇒ x) ⇍ 0.A → A" $ testTCFail "1 · (λ x ⇒ x) ⇍ 0.A → A" $
check_ empty sone check_ empty sone
(^LamY "x" (^BVT 0)) (^LamY "x" (^BVT 0))
(^Arr Zero (^FT "A") (^FT "A")), (^Arr Zero (^FT "A" 0) (^FT "A" 0)),
note "(but ok in overall erased context)", note "(but ok in overall erased context)",
testTC "0 · (λ x ⇒ x) ⇐ A ⇾ A" $ testTC "0 · (λ x ⇒ x) ⇐ A ⇾ A" $
check_ empty szero check_ empty szero
(^LamY "x" (^BVT 0)) (^LamY "x" (^BVT 0))
(^Arr Zero (^FT "A") (^FT "A")), (^Arr Zero (^FT "A" 0) (^FT "A" 0)),
testTC "1 · (λ A x ⇒ refl A x) ⇐ ⋯ # (type of refl)" $ testTC "1 · (λ A x ⇒ refl A x) ⇐ ⋯ # (type of refl)" $
check_ empty sone check_ empty sone
(^LamY "A" (^LamY "x" (E $ ^App (^App (^F "refl") (^BVT 1)) (^BVT 0)))) (^LamY "A" (^LamY "x"
(E $ ^App (^App (^F "refl" 0) (^BVT 1)) (^BVT 0))))
reflTy, reflTy,
testTC "1 · (λ A x ⇒ δ i ⇒ x) ⇐ ⋯ # (def. and type of refl)" $ testTC "1 · (λ A x ⇒ δ i ⇒ x) ⇐ ⋯ # (def. and type of refl)" $
check_ empty sone reflDef reflTy check_ empty sone reflDef reflTy
@ -330,68 +336,87 @@ tests = "typechecker" :- [
"pairs" :- [ "pairs" :- [
testTC "1 · (a, a) ⇐ A × A" $ testTC "1 · (a, a) ⇐ A × A" $
check_ empty sone check_ empty sone
(^Pair (^FT "a") (^FT "a")) (^And (^FT "A") (^FT "A")), (^Pair (^FT "a" 0) (^FT "a" 0)) (^And (^FT "A" 0) (^FT "A" 0)),
testTC "x : A ⊢ 1 · (x, x) ⇐ A × A ⊳ ω·x" $ testTC "x : A ⊢ 1 · (x, x) ⇐ A × A ⊳ ω·x" $
checkQ (ctx [< ("x", ^FT "A")]) sone checkQ (ctx [< ("x", ^FT "A" 0)]) sone
(^Pair (^BVT 0) (^BVT 0)) (^And (^FT "A") (^FT "A")) [< Any], (^Pair (^BVT 0) (^BVT 0)) (^And (^FT "A" 0) (^FT "A" 0)) [< Any],
testTC "1 · (a, δ i ⇒ a) ⇐ (x : A) × (x ≡ a)" $ testTC "1 · (a, δ i ⇒ a) ⇐ (x : A) × (x ≡ a)" $
check_ empty sone check_ empty sone
(^Pair (^FT "a") (^DLamN (^FT "a"))) (^Pair (^FT "a" 0) (^DLamN (^FT "a" 0)))
(^SigY "x" (^FT "A") (^Eq0 (^FT "A") (^BVT 0) (^FT "a"))) (^SigY "x" (^FT "A" 0) (^Eq0 (^FT "A" 0) (^BVT 0) (^FT "a" 0)))
], ],
"unpairing" :- [ "unpairing" :- [
testTC "x : A × A ⊢ 1 · (case1 x return B of (l,r) ⇒ f2 l r) ⇒ B ⊳ 1·x" $ testTC "x : A × A ⊢ 1 · (case1 x return B of (l,r) ⇒ f2 l r) ⇒ B ⊳ 1·x" $
inferAsQ (ctx [< ("x", ^And (^FT "A") (^FT "A"))]) sone inferAsQ (ctx [< ("x", ^And (^FT "A" 0) (^FT "A" 0))]) sone
(^CasePair One (^BV 0) (SN $ ^FT "B") (^CasePair One (^BV 0) (SN $ ^FT "B" 0)
(SY [< "l", "r"] $ E $ ^App (^App (^F "f2") (^BVT 1)) (^BVT 0))) (SY [< "l", "r"] $ E $ ^App (^App (^F "f2" 0) (^BVT 1)) (^BVT 0)))
(^FT "B") [< One], (^FT "B" 0) [< One],
testTC "x : A × A ⊢ 1 · (caseω x return B of (l,r) ⇒ f2 l r) ⇒ B ⊳ ω·x" $ testTC "x : A × A ⊢ 1 · (caseω x return B of (l,r) ⇒ f2 l r) ⇒ B ⊳ ω·x" $
inferAsQ (ctx [< ("x", ^And (^FT "A") (^FT "A"))]) sone inferAsQ (ctx [< ("x", ^And (^FT "A" 0) (^FT "A" 0))]) sone
(^CasePair Any (^BV 0) (SN $ ^FT "B") (^CasePair Any (^BV 0) (SN $ ^FT "B" 0)
(SY [< "l", "r"] $ E $ ^App (^App (^F "f2") (^BVT 1)) (^BVT 0))) (SY [< "l", "r"] $ E $ ^App (^App (^F "f2" 0) (^BVT 1)) (^BVT 0)))
(^FT "B") [< Any], (^FT "B" 0) [< Any],
testTC "x : A × A ⊢ 0 · (caseω x return B of (l,r) ⇒ f2 l r) ⇒ B ⊳ 0·x" $ testTC "x : A × A ⊢ 0 · (caseω x return B of (l,r) ⇒ f2 l r) ⇒ B ⊳ 0·x" $
inferAsQ (ctx [< ("x", ^And (^FT "A") (^FT "A"))]) szero inferAsQ (ctx [< ("x", ^And (^FT "A" 0) (^FT "A" 0))]) szero
(^CasePair Any (^BV 0) (SN $ ^FT "B") (^CasePair Any (^BV 0) (SN $ ^FT "B" 0)
(SY [< "l", "r"] $ E $ ^App (^App (^F "f2") (^BVT 1)) (^BVT 0))) (SY [< "l", "r"] $ E $ ^App (^App (^F "f2" 0) (^BVT 1)) (^BVT 0)))
(^FT "B") [< Zero], (^FT "B" 0) [< Zero],
testTCFail "x : A × A ⊢ 1 · (case0 x return B of (l,r) ⇒ f2 l r) ⇏" $ testTCFail "x : A × A ⊢ 1 · (case0 x return B of (l,r) ⇒ f2 l r) ⇏" $
infer_ (ctx [< ("x", ^And (^FT "A") (^FT "A"))]) sone infer_ (ctx [< ("x", ^And (^FT "A" 0) (^FT "A" 0))]) sone
(^CasePair Zero (^BV 0) (SN $ ^FT "B") (^CasePair Zero (^BV 0) (SN $ ^FT "B" 0)
(SY [< "l", "r"] $ E $ ^App (^App (^F "f2") (^BVT 1)) (^BVT 0))), (SY [< "l", "r"] $ E $ ^App (^App (^F "f2" 0) (^BVT 1)) (^BVT 0))),
testTC "x : A × B ⊢ 1 · (caseω x return A of (l,r) ⇒ l) ⇒ A ⊳ ω·x" $ testTC "x : A × B ⊢ 1 · (caseω x return A of (l,r) ⇒ l) ⇒ A ⊳ ω·x" $
inferAsQ (ctx [< ("x", ^And (^FT "A") (^FT "B"))]) sone inferAsQ (ctx [< ("x", ^And (^FT "A" 0) (^FT "B" 0))]) sone
(^CasePair Any (^BV 0) (SN $ ^FT "A") (^CasePair Any (^BV 0) (SN $ ^FT "A" 0)
(SY [< "l", "r"] $ ^BVT 1)) (SY [< "l", "r"] $ ^BVT 1))
(^FT "A") [< Any], (^FT "A" 0) [< Any],
testTC "x : A × B ⊢ 0 · (case1 x return A of (l,r) ⇒ l) ⇒ A ⊳ 0·x" $ testTC "x : A × B ⊢ 0 · (case1 x return A of (l,r) ⇒ l) ⇒ A ⊳ 0·x" $
inferAsQ (ctx [< ("x", ^And (^FT "A") (^FT "B"))]) szero inferAsQ (ctx [< ("x", ^And (^FT "A" 0) (^FT "B" 0))]) szero
(^CasePair One (^BV 0) (SN $ ^FT "A") (^CasePair One (^BV 0) (SN $ ^FT "A" 0)
(SY [< "l", "r"] $ ^BVT 1)) (SY [< "l", "r"] $ ^BVT 1))
(^FT "A") [< Zero], (^FT "A" 0) [< Zero],
testTCFail "x : A × B ⊢ 1 · (case1 x return A of (l,r) ⇒ l) ⇏" $ testTCFail "x : A × B ⊢ 1 · (case1 x return A of (l,r) ⇒ l) ⇏" $
infer_ (ctx [< ("x", ^And (^FT "A") (^FT "B"))]) sone infer_ (ctx [< ("x", ^And (^FT "A" 0) (^FT "B" 0))]) sone
(^CasePair One (^BV 0) (SN $ ^FT "A") (^CasePair One (^BV 0) (SN $ ^FT "A" 0)
(SY [< "l", "r"] $ ^BVT 1)), (SY [< "l", "r"] $ ^BVT 1)),
note "fst : (0·A : ★₁) → (0·B : A ↠ ★₁) → ((x : A) × B x) ↠ A", note "fst : 0.(A : ★₀) → 0.(B : ω.A → ★₀) → ω.((x : A) × B x) → A",
note " ≔ (λ A B p ⇒ caseω p return A of (x, y) ⇒ x)", note " ≔ (λ A B p ⇒ caseω p return A of (x, y) ⇒ x)",
testTC "0 · type of fst ⇐ ★" $ testTC "0 · type of fst ⇐ ★" $
check_ empty szero fstTy (^TYPE 2), check_ empty szero fstTy (^TYPE 1),
testTC "1 · def of fsttype of fst" $ testTC "1 · def of fsttype of fst" $
check_ empty sone fstDef fstTy, check_ empty sone fstDef fstTy,
note "snd : (0·A : ★₁) → (0·B : A ↠ ★₁) → (ω·p : (x : A) × B x) → B (fst A B p)", note "snd : 0.(A : ★₀) → 0.(B : A ↠ ★₀) → ω.(p : (x : A) × B x) → B (fst A B p)",
note " ≔ (λ A B p ⇒ caseω p return p ⇒ B (fst A B p) of (x, y) ⇒ y)", note " ≔ (λ A B p ⇒ caseω p return p ⇒ B (fst A B p) of (x, y) ⇒ y)",
testTC "0 · type of snd ⇐ ★" $ testTC "0 · type of snd ⇐ ★" $
check_ empty szero sndTy (^TYPE 2), check_ empty szero sndTy (^TYPE 1),
testTC "1 · def of sndtype of snd" $ testTC "1 · def of sndtype of snd" $
check_ empty sone sndDef sndTy, check_ empty sone sndDef sndTy,
testTC "0 · snd ★₀ (λ x ⇒ x) ⇒ (ω·p : (A : ★₀) × A) → fst ★₀ (λ x ⇒ x) p" $ testTC "0 · snd A P ⇒ ω.(p : (x : A) × P x) → P (fst A P p)" $
inferAs empty szero inferAs empty szero
(^App (^App (^F "snd") (^TYPE 0)) (^LamY "x" (^BVT 0))) (^App (^App (^F "snd" 0) (^FT "A" 0)) (^FT "P" 0))
(^PiY Any "p" (^SigY "A" (^TYPE 0) (^BVT 0)) (^PiY Any "p" (^SigY "x" (^FT "A" 0) (E $ ^App (^F "P" 0) (^BVT 0)))
(E $ ^App (^App (^App (^F "fst") (^TYPE 0)) (^LamY "x" (^BVT 0))) (E $ ^App (^F "P" 0)
(^BVT 0))) (E $ apps (^F "fst" 0) [^FT "A" 0, ^FT "P" 0, ^BVT 0]))),
testTC "1 · fst A (λ _ ⇒ B) (a, b) ⇒ A" $
inferAs empty sone
(apps (^F "fst" 0)
[^FT "A" 0, ^LamN (^FT "B" 0), ^Pair (^FT "a" 0) (^FT "b" 0)])
(^FT "A" 0),
testTC "1 · fst¹ A (λ _ ⇒ B) (a, b) ⇒ A" $
inferAs empty sone
(apps (^F "fst" 1)
[^FT "A" 0, ^LamN (^FT "B" 0), ^Pair (^FT "a" 0) (^FT "b" 0)])
(^FT "A" 0),
testTCFail "1 · fst ★⁰ (λ _ ⇒ ★⁰) (A, B) ⇏" $
infer_ empty sone
(apps (^F "fst" 0)
[^TYPE 0, ^LamN (^TYPE 0), ^Pair (^FT "A" 0) (^FT "B" 0)]),
testTC "0 · fst¹ ★⁰ (λ _ ⇒ ★⁰) (A, B) ⇒ ★⁰" $
inferAs empty szero
(apps (^F "fst" 1)
[^TYPE 0, ^LamN (^TYPE 0), ^Pair (^FT "A" 0) (^FT "B" 0)])
(^TYPE 0)
], ],
"enums" :- [ "enums" :- [
@ -435,33 +460,35 @@ tests = "typechecker" :- [
(^Eq0 (^enum ["beep"]) (^Zero) (^Tag "beep")) (^Eq0 (^enum ["beep"]) (^Zero) (^Tag "beep"))
Nothing, Nothing,
testTC "ab : A ≡ B : ★₀, x : A, y : B ⊢ 0 · Eq [i ⇒ ab i] x y ⇐ ★₀" $ testTC "ab : A ≡ B : ★₀, x : A, y : B ⊢ 0 · Eq [i ⇒ ab i] x y ⇐ ★₀" $
check_ (ctx [< ("ab", ^Eq0 (^TYPE 0) (^FT "A") (^FT "B")), check_ (ctx [< ("ab", ^Eq0 (^TYPE 0) (^FT "A" 0) (^FT "B" 0)),
("x", ^FT "A"), ("y", ^FT "B")]) szero ("x", ^FT "A" 0), ("y", ^FT "B" 0)]) szero
(^EqY "i" (E $ ^DApp (^BV 2) (^BV 0)) (^BVT 1) (^BVT 0)) (^EqY "i" (E $ ^DApp (^BV 2) (^BV 0)) (^BVT 1) (^BVT 0))
(^TYPE 0), (^TYPE 0),
testTCFail "ab : A ≡ B : ★₀, x : A, y : B ⊢ Eq [i ⇒ ab i] y x ⇍ Type" $ testTCFail "ab : A ≡ B : ★₀, x : A, y : B ⊢ Eq [i ⇒ ab i] y x ⇍ Type" $
check_ (ctx [< ("ab", ^Eq0 (^TYPE 0) (^FT "A") (^FT "B")), check_ (ctx [< ("ab", ^Eq0 (^TYPE 0) (^FT "A" 0) (^FT "B" 0)),
("x", ^FT "A"), ("y", ^FT "B")]) szero ("x", ^FT "A" 0), ("y", ^FT "B" 0)]) szero
(^EqY "i" (E $ ^DApp (^BV 2) (^BV 0)) (^BVT 0) (^BVT 1)) (^EqY "i" (E $ ^DApp (^BV 2) (^BV 0)) (^BVT 0) (^BVT 1))
(^TYPE 0) (^TYPE 0)
], ],
"equalities" :- [ "equalities" :- [
testTC "1 · (δ i ⇒ a) ⇐ a ≡ a" $ testTC "1 · (δ i ⇒ a) ⇐ a ≡ a" $
check_ empty sone (^DLamN (^FT "a")) check_ empty sone (^DLamN (^FT "a" 0))
(^Eq0 (^FT "A") (^FT "a") (^FT "a")), (^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a" 0)),
testTC "0 · (λ p q ⇒ δ i ⇒ p) ⇐ (ω·p q : a ≡ a') → p ≡ q # uip" $ testTC "0 · (λ p q ⇒ δ i ⇒ p) ⇐ (ω·p q : a ≡ a') → p ≡ q # uip" $
check_ empty szero check_ empty szero
(^LamY "p" (^LamY "q" (^DLamN (^BVT 1)))) (^LamY "p" (^LamY "q" (^DLamN (^BVT 1))))
(^PiY Any "p" (^Eq0 (^FT "A") (^FT "a") (^FT "a")) (^PiY Any "p" (^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a" 0))
(^PiY Any "q" (^Eq0 (^FT "A") (^FT "a") (^FT "a")) (^PiY Any "q" (^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a" 0))
(^Eq0 (^Eq0 (^FT "A") (^FT "a") (^FT "a")) (^BVT 1) (^BVT 0)))), (^Eq0 (^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a" 0))
(^BVT 1) (^BVT 0)))),
testTC "0 · (λ p q ⇒ δ i ⇒ q) ⇐ (ω·p q : a ≡ a') → p ≡ q # uip(2)" $ testTC "0 · (λ p q ⇒ δ i ⇒ q) ⇐ (ω·p q : a ≡ a') → p ≡ q # uip(2)" $
check_ empty szero check_ empty szero
(^LamY "p" (^LamY "q" (^DLamN (^BVT 0)))) (^LamY "p" (^LamY "q" (^DLamN (^BVT 0))))
(^PiY Any "p" (^Eq0 (^FT "A") (^FT "a") (^FT "a")) (^PiY Any "p" (^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a" 0))
(^PiY Any "q" (^Eq0 (^FT "A") (^FT "a") (^FT "a")) (^PiY Any "q" (^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a" 0))
(^Eq0 (^Eq0 (^FT "A") (^FT "a") (^FT "a")) (^BVT 1) (^BVT 0)))) (^Eq0 (^Eq0 (^FT "A" 0) (^FT "a" 0) (^FT "a" 0))
(^BVT 1) (^BVT 0))))
], ],
"natural numbers" :- [ "natural numbers" :- [