quox/lib/Quox/Typing.idr

135 lines
3.5 KiB
Idris
Raw Normal View History

2021-12-23 13:05:50 -05:00
module Quox.Typing
2023-03-13 16:41:57 -04:00
import public Quox.Typing.Context as Typing
import public Quox.Typing.EqMode as Typing
import public Quox.Typing.Error as Typing
2021-12-23 13:05:50 -05:00
import public Quox.Syntax
2022-08-22 04:17:08 -04:00
import public Quox.Definition
import public Quox.Reduce
2021-12-23 13:05:50 -05:00
%default total
2021-12-23 13:05:50 -05:00
namespace TContext
2023-02-14 15:14:47 -05:00
export %inline
2023-01-08 14:44:25 -05:00
pushD : TContext q d n -> TContext q (S d) n
pushD tel = map (// shift 1) tel
2021-12-23 13:05:50 -05:00
2023-02-22 01:40:19 -05:00
export %inline
zeroFor : IsQty q => Context tm n -> QOutput q n
zeroFor ctx = zero <$ ctx
2021-12-23 13:05:50 -05:00
namespace TyContext
public export %inline
empty : {d : Nat} -> TyContext q d 0
empty = MkTyContext {dctx = new, tctx = [<]}
2023-02-14 15:14:47 -05:00
export %inline
extendTyN : Telescope (Term q d) from to ->
2023-01-26 13:54:46 -05:00
TyContext q d from -> TyContext q d to
2023-02-14 15:14:47 -05:00
extendTyN ss = {tctx $= (. ss)}
2023-01-26 13:54:46 -05:00
2023-02-14 15:14:47 -05:00
export %inline
extendTy : Term q d n -> TyContext q d n -> TyContext q d (S n)
extendTy s = extendTyN [< s]
2021-12-23 13:05:50 -05:00
2023-02-14 15:14:47 -05:00
export %inline
2023-01-08 14:44:25 -05:00
extendDim : TyContext q d n -> TyContext q (S d) n
2023-02-14 15:29:04 -05:00
extendDim = {dctx $= (:<? Nothing), tctx $= pushD}
2021-12-23 13:05:50 -05:00
2023-02-14 15:14:47 -05:00
export %inline
2023-01-08 14:44:25 -05:00
eqDim : Dim d -> Dim d -> TyContext q d n -> TyContext q d n
2023-02-14 15:29:04 -05:00
eqDim p q = {dctx $= set p q}
2021-12-23 13:05:50 -05:00
namespace QOutput
2023-01-08 14:44:25 -05:00
parameters {auto _ : IsQty q}
2023-02-14 15:14:47 -05:00
export %inline
2023-01-08 14:44:25 -05:00
(+) : QOutput q n -> QOutput q n -> QOutput q n
(+) = zipWith (+)
2021-12-23 13:05:50 -05:00
2023-02-14 15:14:47 -05:00
export %inline
2023-01-08 14:44:25 -05:00
(*) : q -> QOutput q n -> QOutput q n
(*) pi = map (pi *)
2021-12-23 13:05:50 -05:00
2023-02-14 15:14:47 -05:00
export %inline
zeroFor : TyContext q _ n -> QOutput q n
2023-02-22 01:40:19 -05:00
zeroFor ctx = zeroFor ctx.tctx
2022-04-23 18:21:30 -04:00
public export
2023-02-19 11:51:44 -05:00
CheckResult' : Type -> Nat -> Type
CheckResult' = QOutput
2022-04-23 18:21:30 -04:00
public export
2023-02-19 11:51:44 -05:00
CheckResult : DimEq d -> Type -> Nat -> Type
CheckResult eqs q n = IfConsistent eqs $ CheckResult' q n
public export
record InferResult' q d n where
2022-04-23 18:21:30 -04:00
constructor InfRes
2023-01-08 14:44:25 -05:00
type : Term q d n
qout : QOutput q n
2022-04-23 18:21:30 -04:00
2023-02-19 11:51:44 -05:00
public export
InferResult : DimEq d -> TermLike
InferResult eqs q d n = IfConsistent eqs $ InferResult' q d n
2022-04-23 18:21:30 -04:00
2023-02-10 15:40:44 -05:00
export
lookupFree' : HasErr q m => Definitions' q g -> Name -> m (Definition' q g)
lookupFree' defs x =
case lookup x defs of
Just d => pure d
Nothing => throwError $ NotInScope x
2023-02-12 15:30:08 -05:00
public export
2023-02-10 15:40:44 -05:00
substCasePairRet : Term q d n -> ScopeTerm q d n -> Term q d (2 + n)
substCasePairRet dty retty =
let arg = Pair (BVT 0) (BVT 1) :# (dty // fromNat 2) in
retty.term // (arg ::: shift 2)
2023-02-11 12:15:50 -05:00
parameters {auto _ : HasErr q m} (defs : Definitions' q _)
export covering %inline
2023-03-13 14:39:29 -04:00
whnfT : {0 isRedex : RedexTest tm} -> Whnf tm isRedex WhnfError =>
tm q d n -> m (NonRedex tm q d n defs)
whnfT = either (throwError . WhnfError) pure . whnf defs
2023-02-11 12:15:50 -05:00
export covering %inline
expectTYPE : Term q d n -> m Universe
expectTYPE s =
case fst !(whnfT s) of
2023-02-11 12:15:50 -05:00
TYPE l => pure l
_ => throwError $ ExpectedTYPE s
export covering %inline
expectPi : Term q d n -> m (q, Term q d n, ScopeTerm q d n)
expectPi s =
case fst !(whnfT s) of
2023-02-11 12:15:50 -05:00
Pi {qty, arg, res, _} => pure (qty, arg, res)
_ => throwError $ ExpectedPi s
export covering %inline
expectSig : Term q d n -> m (Term q d n, ScopeTerm q d n)
expectSig s =
case fst !(whnfT s) of
2023-02-11 12:15:50 -05:00
Sig {fst, snd, _} => pure (fst, snd)
_ => throwError $ ExpectedSig s
export covering %inline
expectEnum : Term q d n -> m (SortedSet TagVal)
expectEnum s =
case fst !(whnfT s) of
Enum tags => pure tags
_ => throwError $ ExpectedEnum s
2023-02-11 12:15:50 -05:00
export covering %inline
expectEq : Term q d n -> m (DScopeTerm q d n, Term q d n, Term q d n)
expectEq s =
case fst !(whnfT s) of
2023-02-11 12:15:50 -05:00
Eq {ty, l, r, _} => pure (ty, l, r)
_ => throwError $ ExpectedEq s