quox/lib/Quox/Syntax/Term/Base.idr

164 lines
4.5 KiB
Idris
Raw Normal View History

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
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
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
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
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