2022-04-23 18:21:30 -04:00
|
|
|
|
module Quox.Syntax.Term.Base
|
|
|
|
|
|
|
|
|
|
import public Quox.Syntax.Var
|
|
|
|
|
import public Quox.Syntax.Shift
|
|
|
|
|
import public Quox.Syntax.Subst
|
|
|
|
|
import public Quox.Syntax.Universe
|
|
|
|
|
import public Quox.Syntax.Qty
|
|
|
|
|
import public Quox.Syntax.Dim
|
|
|
|
|
import public Quox.Name
|
2023-01-08 09:43:54 -05:00
|
|
|
|
-- import public Quox.OPE
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
|
|
|
|
import Quox.Pretty
|
|
|
|
|
|
|
|
|
|
import public Data.DPair
|
|
|
|
|
import Data.List
|
|
|
|
|
import Data.Maybe
|
|
|
|
|
import Data.Nat
|
|
|
|
|
import public Data.So
|
|
|
|
|
import Data.String
|
|
|
|
|
import Data.Vect
|
|
|
|
|
|
|
|
|
|
%default total
|
|
|
|
|
|
|
|
|
|
|
2023-01-22 18:53:34 -05:00
|
|
|
|
public export
|
|
|
|
|
0 TermLike : Type
|
|
|
|
|
TermLike = Type -> Nat -> Nat -> Type
|
|
|
|
|
|
|
|
|
|
public export
|
|
|
|
|
0 TSubstLike : Type
|
|
|
|
|
TSubstLike = Type -> Nat -> Nat -> Nat -> Type
|
|
|
|
|
|
|
|
|
|
|
2022-04-23 18:21:30 -04:00
|
|
|
|
infixl 8 :#
|
2023-01-20 20:34:28 -05:00
|
|
|
|
infixl 9 :@, :%
|
2022-04-23 18:21:30 -04:00
|
|
|
|
mutual
|
|
|
|
|
public export
|
2023-01-22 18:53:34 -05:00
|
|
|
|
0 TSubst : TSubstLike
|
2023-01-20 20:34:28 -05:00
|
|
|
|
TSubst q d = Subst $ Elim q d
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
2023-01-20 20:34:28 -05:00
|
|
|
|
||| first argument `q` is quantity type;
|
|
|
|
|
||| second argument `d` is dimension scope size;
|
|
|
|
|
||| third `n` is term scope size
|
2022-04-23 18:21:30 -04:00
|
|
|
|
public export
|
2023-01-22 18:53:34 -05:00
|
|
|
|
data Term : TermLike where
|
2022-04-23 18:21:30 -04:00
|
|
|
|
||| type of types
|
2023-01-08 14:44:25 -05:00
|
|
|
|
TYPE : (l : Universe) -> Term q d n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
|
|
|
|
||| function type
|
2023-01-08 14:44:25 -05:00
|
|
|
|
Pi : (qty : q) -> (x : Name) ->
|
|
|
|
|
(arg : Term q d n) -> (res : ScopeTerm q d n) -> Term q d n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
||| function term
|
2023-01-08 14:44:25 -05:00
|
|
|
|
Lam : (x : Name) -> (body : ScopeTerm q d n) -> Term q d n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
2023-01-26 13:54:46 -05:00
|
|
|
|
||| pair type
|
|
|
|
|
Sig : (x : Name) -> (fst : Term q d n) -> (snd : ScopeTerm q d n) ->
|
|
|
|
|
Term q d n
|
|
|
|
|
||| pair value
|
|
|
|
|
Pair : (fst, snd : Term q d n) -> Term q d n
|
|
|
|
|
|
2023-01-20 20:34:28 -05:00
|
|
|
|
||| equality type
|
|
|
|
|
Eq : (i : Name) -> (ty : DScopeTerm q d n) -> (l, r : Term q d n) ->
|
|
|
|
|
Term q d n
|
|
|
|
|
||| equality term
|
|
|
|
|
DLam : (i : Name) -> (body : DScopeTerm q d n) -> Term q d n
|
|
|
|
|
|
2022-04-23 18:21:30 -04:00
|
|
|
|
||| elimination
|
2023-01-08 14:44:25 -05:00
|
|
|
|
E : (e : Elim q d n) -> Term q d n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
|
|
|
|
||| term closure/suspended substitution
|
2023-01-08 14:44:25 -05:00
|
|
|
|
CloT : (tm : Term q d from) -> (th : Lazy (TSubst q d from to)) ->
|
|
|
|
|
Term q d to
|
2022-04-23 18:21:30 -04:00
|
|
|
|
||| dimension closure/suspended substitution
|
2023-01-08 14:44:25 -05:00
|
|
|
|
DCloT : (tm : Term q dfrom n) -> (th : Lazy (DSubst dfrom dto)) ->
|
|
|
|
|
Term q dto n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
|
|
|
|
||| first argument `d` is dimension scope size, second `n` is term scope size
|
|
|
|
|
public export
|
2023-01-22 18:53:34 -05:00
|
|
|
|
data Elim : TermLike where
|
2022-04-23 18:21:30 -04:00
|
|
|
|
||| free variable
|
2023-01-08 14:44:25 -05:00
|
|
|
|
F : (x : Name) -> Elim q d n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
||| bound variable
|
2023-01-08 14:44:25 -05:00
|
|
|
|
B : (i : Var n) -> Elim q d n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
|
|
|
|
||| term application
|
2023-01-08 14:44:25 -05:00
|
|
|
|
(:@) : (fun : Elim q d n) -> (arg : Term q d n) -> Elim q d n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
2023-01-26 13:54:46 -05:00
|
|
|
|
||| pair destruction
|
|
|
|
|
|||
|
|
|
|
|
||| `CasePair 𝜋 𝑒 𝑟 𝐴 𝑥 𝑦 𝑡` is
|
|
|
|
|
||| `𝐜𝐚𝐬𝐞 𝜋 · 𝑒 𝐫𝐞𝐭𝐮𝐫𝐧 𝑟 ⇒ 𝐴 𝐨𝐟 { (𝑥, 𝑦) ⇒ 𝑡 }`
|
|
|
|
|
CasePair : (qty : q) -> (pair : Elim q d n) ->
|
|
|
|
|
(r : Name) -> (ret : ScopeTerm q d n) ->
|
|
|
|
|
(x, y : Name) -> (body : ScopeTermN 2 q d n) ->
|
|
|
|
|
Elim q d n
|
|
|
|
|
|
2023-01-20 20:34:28 -05:00
|
|
|
|
||| dim application
|
|
|
|
|
(:%) : (fun : Elim q d n) -> (arg : Dim d) -> Elim q d n
|
|
|
|
|
|
2022-04-23 18:21:30 -04:00
|
|
|
|
||| type-annotated term
|
2023-01-08 14:44:25 -05:00
|
|
|
|
(:#) : (tm, ty : Term q d n) -> Elim q d n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
|
|
|
|
||| term closure/suspended substitution
|
2023-01-08 14:44:25 -05:00
|
|
|
|
CloE : (el : Elim q d from) -> (th : Lazy (TSubst q d from to)) ->
|
|
|
|
|
Elim q d to
|
2022-04-23 18:21:30 -04:00
|
|
|
|
||| dimension closure/suspended substitution
|
2023-01-08 14:44:25 -05:00
|
|
|
|
DCloE : (el : Elim q dfrom n) -> (th : Lazy (DSubst dfrom dto)) ->
|
|
|
|
|
Elim q dto n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
2023-01-22 21:22:50 -05:00
|
|
|
|
||| a scope with some more bound term variables
|
2022-04-23 18:21:30 -04:00
|
|
|
|
public export
|
2023-01-22 21:22:50 -05:00
|
|
|
|
data ScopeTermN : Nat -> TermLike where
|
|
|
|
|
||| at least some variables are used
|
|
|
|
|
TUsed : (body : Term q d (s + n)) -> ScopeTermN s q d n
|
|
|
|
|
||| all variables are unused
|
|
|
|
|
TUnused : (body : Term q d n) -> ScopeTermN s q d n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
|
|
|
|
public export
|
2023-01-22 21:22:50 -05:00
|
|
|
|
0 ScopeTerm : TermLike
|
|
|
|
|
ScopeTerm = ScopeTermN 1
|
|
|
|
|
|
|
|
|
|
||| a scope with some more bound dimension variable
|
|
|
|
|
public export
|
|
|
|
|
data DScopeTermN : Nat -> TermLike where
|
|
|
|
|
||| at least some variables are used
|
|
|
|
|
DUsed : (body : Term q (s + d) n) -> DScopeTermN s q d n
|
|
|
|
|
||| all variables are unused
|
|
|
|
|
DUnused : (body : Term q d n) -> DScopeTermN s q d n
|
|
|
|
|
|
|
|
|
|
public export
|
|
|
|
|
0 DScopeTerm : TermLike
|
|
|
|
|
DScopeTerm = DScopeTermN 1
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
|
|
|
|
%name Term s, t, r
|
|
|
|
|
%name Elim e, f
|
2023-01-22 21:22:50 -05:00
|
|
|
|
%name ScopeTermN body
|
|
|
|
|
%name DScopeTermN body
|
2022-04-23 18:21:30 -04:00
|
|
|
|
|
2023-01-20 20:34:28 -05:00
|
|
|
|
||| non dependent function type
|
2022-04-27 14:06:39 -04:00
|
|
|
|
public export %inline
|
2023-01-08 14:44:25 -05:00
|
|
|
|
Arr : (qty : q) -> (arg, res : Term q d n) -> Term q d n
|
2022-05-25 10:03:23 -04:00
|
|
|
|
Arr {qty, arg, res} = Pi {qty, x = "_", arg, res = TUnused res}
|
2022-04-27 14:06:39 -04:00
|
|
|
|
|
2023-01-20 20:34:28 -05:00
|
|
|
|
||| non dependent equality type
|
|
|
|
|
public export %inline
|
|
|
|
|
Eq0 : (ty, l, r : Term q d n) -> Term q d n
|
|
|
|
|
Eq0 {ty, l, r} = Eq {i = "_", ty = DUnused ty, l, r}
|
|
|
|
|
|
2022-04-23 18:21:30 -04:00
|
|
|
|
||| same as `F` but as a term
|
|
|
|
|
public export %inline
|
2023-01-08 14:44:25 -05:00
|
|
|
|
FT : Name -> Term q d n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
FT = E . F
|
|
|
|
|
|
|
|
|
|
||| abbreviation for a bound variable like `BV 4` instead of
|
|
|
|
|
||| `B (VS (VS (VS (VS VZ))))`
|
|
|
|
|
public export %inline
|
2023-01-08 14:44:25 -05:00
|
|
|
|
BV : (i : Nat) -> (0 _ : LT i n) => Elim q d n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
BV i = B $ V i
|
|
|
|
|
|
|
|
|
|
||| same as `BV` but as a term
|
|
|
|
|
public export %inline
|
2023-01-08 14:44:25 -05:00
|
|
|
|
BVT : (i : Nat) -> (0 _ : LT i n) => Term q d n
|
2022-04-23 18:21:30 -04:00
|
|
|
|
BVT i = E $ BV i
|