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
|
2023-02-19 12:22:53 -05:00
|
|
|
import public Quox.Reduce
|
2021-12-23 13:05:50 -05:00
|
|
|
|
2023-03-31 13:23:30 -04:00
|
|
|
import Control.Eff
|
|
|
|
|
2022-08-22 23:43:23 -04:00
|
|
|
%default total
|
2021-12-23 13:05:50 -05:00
|
|
|
|
|
|
|
|
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
|
2023-03-31 13:23:30 -04:00
|
|
|
lookupFree' : Has (ErrorEff q) fs =>
|
|
|
|
Definitions' q g -> Name -> Eff fs (Definition' q g)
|
2023-02-10 15:40:44 -05:00
|
|
|
lookupFree' defs x =
|
|
|
|
case lookup x defs of
|
|
|
|
Just d => pure d
|
2023-03-31 13:23:30 -04:00
|
|
|
Nothing => throw $ NotInScope x
|
2023-02-10 15:40:44 -05:00
|
|
|
|
|
|
|
|
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
|
|
|
|
2023-03-26 08:40:54 -04:00
|
|
|
public export
|
|
|
|
substCaseNatRet : ScopeTerm q d n -> Term q d (2 + n)
|
|
|
|
substCaseNatRet retty = retty.term // (Succ (BVT 1) :# Nat ::: shift 2)
|
|
|
|
|
2023-03-31 13:11:35 -04:00
|
|
|
public export
|
|
|
|
substCaseBoxRet : Term q d n -> ScopeTerm q d n -> Term q d (S n)
|
|
|
|
substCaseBoxRet dty retty =
|
|
|
|
retty.term // (Box (BVT 0) :# weakT dty ::: shift 1)
|
2023-02-11 12:15:50 -05:00
|
|
|
|
2023-03-31 13:23:30 -04:00
|
|
|
|
|
|
|
parameters (defs : Definitions' q _) {auto _ : Has (ErrorEff q) fs}
|
2023-02-22 01:45:10 -05:00
|
|
|
export covering %inline
|
2023-03-13 14:39:29 -04:00
|
|
|
whnfT : {0 isRedex : RedexTest tm} -> Whnf tm isRedex WhnfError =>
|
2023-03-31 13:23:30 -04:00
|
|
|
{d, n : Nat} -> tm q d n -> Eff fs (NonRedex tm q d n defs)
|
|
|
|
whnfT = either (throw . WhnfError) pure . whnf defs
|
2023-02-22 01:45:10 -05:00
|
|
|
|
2023-03-25 17:41:30 -04:00
|
|
|
parameters {d2, n : Nat} (ctx : Lazy (TyContext q d1 n))
|
|
|
|
(th : Lazy (DSubst d2 d1))
|
2023-03-13 22:22:26 -04:00
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectTYPE_ : Term q d2 n -> Eff fs Universe
|
2023-03-13 22:22:26 -04:00
|
|
|
expectTYPE_ s = case fst !(whnfT s) of
|
2023-02-11 12:15:50 -05:00
|
|
|
TYPE l => pure l
|
2023-03-31 13:23:30 -04:00
|
|
|
_ => throw $ ExpectedTYPE ctx (s // th)
|
2023-02-11 12:15:50 -05:00
|
|
|
|
2023-03-13 22:22:26 -04:00
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectPi_ : Term q d2 n -> Eff fs (q, Term q d2 n, ScopeTerm q d2 n)
|
2023-03-13 22:22:26 -04:00
|
|
|
expectPi_ s = case fst !(whnfT s) of
|
2023-02-11 12:15:50 -05:00
|
|
|
Pi {qty, arg, res, _} => pure (qty, arg, res)
|
2023-03-31 13:23:30 -04:00
|
|
|
_ => throw $ ExpectedPi ctx (s // th)
|
2023-02-11 12:15:50 -05:00
|
|
|
|
2023-03-13 22:22:26 -04:00
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectSig_ : Term q d2 n -> Eff fs (Term q d2 n, ScopeTerm q d2 n)
|
2023-03-13 22:22:26 -04:00
|
|
|
expectSig_ s = case fst !(whnfT s) of
|
2023-02-11 12:15:50 -05:00
|
|
|
Sig {fst, snd, _} => pure (fst, snd)
|
2023-03-31 13:23:30 -04:00
|
|
|
_ => throw $ ExpectedSig ctx (s // th)
|
2023-02-11 12:15:50 -05:00
|
|
|
|
2023-03-13 22:22:26 -04:00
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectEnum_ : Term q d2 n -> Eff fs (SortedSet TagVal)
|
2023-03-13 22:22:26 -04:00
|
|
|
expectEnum_ s = case fst !(whnfT s) of
|
2023-02-22 01:45:10 -05:00
|
|
|
Enum tags => pure tags
|
2023-03-31 13:23:30 -04:00
|
|
|
_ => throw $ ExpectedEnum ctx (s // th)
|
2023-02-22 01:45:10 -05:00
|
|
|
|
2023-03-13 22:22:26 -04:00
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectEq_ : Term q d2 n ->
|
|
|
|
Eff fs (DScopeTerm q d2 n, Term q d2 n, Term q d2 n)
|
2023-03-13 22:22:26 -04:00
|
|
|
expectEq_ s = case fst !(whnfT s) of
|
2023-02-11 12:15:50 -05:00
|
|
|
Eq {ty, l, r, _} => pure (ty, l, r)
|
2023-03-31 13:23:30 -04:00
|
|
|
_ => throw $ ExpectedEq ctx (s // th)
|
2023-03-13 22:22:26 -04:00
|
|
|
|
2023-03-26 08:40:54 -04:00
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectNat_ : Term q d2 n -> Eff fs ()
|
2023-03-26 08:40:54 -04:00
|
|
|
expectNat_ s = case fst !(whnfT s) of
|
|
|
|
Nat => pure ()
|
2023-03-31 13:23:30 -04:00
|
|
|
_ => throw $ ExpectedNat ctx (s // th)
|
2023-03-26 08:40:54 -04:00
|
|
|
|
2023-03-31 13:11:35 -04:00
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectBOX_ : Term q d2 n -> Eff fs (q, Term q d2 n)
|
2023-03-31 13:11:35 -04:00
|
|
|
expectBOX_ s = case fst !(whnfT s) of
|
|
|
|
BOX q a => pure (q, a)
|
2023-03-31 13:23:30 -04:00
|
|
|
_ => throw $ ExpectedBOX ctx (s // th)
|
2023-03-31 13:11:35 -04:00
|
|
|
|
2023-03-13 22:22:26 -04:00
|
|
|
|
|
|
|
-- [fixme] refactor this stuff
|
|
|
|
|
|
|
|
parameters (ctx : TyContext q d n)
|
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectTYPE : Term q d n -> Eff fs Universe
|
2023-03-25 17:41:30 -04:00
|
|
|
expectTYPE =
|
|
|
|
let Val d = ctx.dimLen; Val n = ctx.termLen in
|
|
|
|
expectTYPE_ ctx id
|
2023-03-13 22:22:26 -04:00
|
|
|
|
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectPi : Term q d n -> Eff fs (q, Term q d n, ScopeTerm q d n)
|
2023-03-25 17:41:30 -04:00
|
|
|
expectPi =
|
|
|
|
let Val d = ctx.dimLen; Val n = ctx.termLen in
|
|
|
|
expectPi_ ctx id
|
2023-03-13 22:22:26 -04:00
|
|
|
|
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectSig : Term q d n -> Eff fs (Term q d n, ScopeTerm q d n)
|
2023-03-25 17:41:30 -04:00
|
|
|
expectSig =
|
|
|
|
let Val d = ctx.dimLen; Val n = ctx.termLen in
|
|
|
|
expectSig_ ctx id
|
2023-03-13 22:22:26 -04:00
|
|
|
|
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectEnum : Term q d n -> Eff fs (SortedSet TagVal)
|
2023-03-25 17:41:30 -04:00
|
|
|
expectEnum =
|
|
|
|
let Val d = ctx.dimLen; Val n = ctx.termLen in
|
|
|
|
expectEnum_ ctx id
|
2023-03-13 22:22:26 -04:00
|
|
|
|
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectEq : Term q d n -> Eff fs (DScopeTerm q d n, Term q d n, Term q d n)
|
2023-03-25 17:41:30 -04:00
|
|
|
expectEq =
|
|
|
|
let Val d = ctx.dimLen; Val n = ctx.termLen in
|
|
|
|
expectEq_ ctx id
|
2023-03-13 22:22:26 -04:00
|
|
|
|
2023-03-26 08:40:54 -04:00
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectNat : Term q d n -> Eff fs ()
|
2023-03-26 08:40:54 -04:00
|
|
|
expectNat =
|
|
|
|
let Val d = ctx.dimLen; Val n = ctx.termLen in
|
|
|
|
expectNat_ ctx id
|
|
|
|
|
2023-03-31 13:11:35 -04:00
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectBOX : Term q d n -> Eff fs (q, Term q d n)
|
2023-03-31 13:11:35 -04:00
|
|
|
expectBOX =
|
|
|
|
let Val d = ctx.dimLen; Val n = ctx.termLen in
|
|
|
|
expectBOX_ ctx id
|
|
|
|
|
2023-03-13 22:22:26 -04:00
|
|
|
|
|
|
|
parameters (ctx : EqContext q n)
|
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectTYPEE : Term q 0 n -> Eff fs Universe
|
2023-03-25 17:41:30 -04:00
|
|
|
expectTYPEE t =
|
|
|
|
let Val n = ctx.termLen in
|
|
|
|
expectTYPE_ (toTyContext ctx) (shift0 ctx.dimLen) t
|
2023-03-13 22:22:26 -04:00
|
|
|
|
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectPiE : Term q 0 n -> Eff fs (q, Term q 0 n, ScopeTerm q 0 n)
|
2023-03-25 17:41:30 -04:00
|
|
|
expectPiE t =
|
|
|
|
let Val n = ctx.termLen in
|
|
|
|
expectPi_ (toTyContext ctx) (shift0 ctx.dimLen) t
|
2023-03-13 22:22:26 -04:00
|
|
|
|
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectSigE : Term q 0 n -> Eff fs (Term q 0 n, ScopeTerm q 0 n)
|
2023-03-25 17:41:30 -04:00
|
|
|
expectSigE t =
|
|
|
|
let Val n = ctx.termLen in
|
|
|
|
expectSig_ (toTyContext ctx) (shift0 ctx.dimLen) t
|
2023-03-13 22:22:26 -04:00
|
|
|
|
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectEnumE : Term q 0 n -> Eff fs (SortedSet TagVal)
|
2023-03-25 17:41:30 -04:00
|
|
|
expectEnumE t =
|
|
|
|
let Val n = ctx.termLen in
|
|
|
|
expectEnum_ (toTyContext ctx) (shift0 ctx.dimLen) t
|
2023-03-13 22:22:26 -04:00
|
|
|
|
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectEqE : Term q 0 n -> Eff fs (DScopeTerm q 0 n, Term q 0 n, Term q 0 n)
|
2023-03-25 17:41:30 -04:00
|
|
|
expectEqE t =
|
|
|
|
let Val n = ctx.termLen in
|
|
|
|
expectEq_ (toTyContext ctx) (shift0 ctx.dimLen) t
|
2023-03-26 08:40:54 -04:00
|
|
|
|
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectNatE : Term q 0 n -> Eff fs ()
|
2023-03-26 08:40:54 -04:00
|
|
|
expectNatE t =
|
|
|
|
let Val n = ctx.termLen in
|
|
|
|
expectNat_ (toTyContext ctx) (shift0 ctx.dimLen) t
|
2023-03-31 13:11:35 -04:00
|
|
|
|
|
|
|
export covering %inline
|
2023-03-31 13:23:30 -04:00
|
|
|
expectBOXE : Term q 0 n -> Eff fs (q, Term q 0 n)
|
2023-03-31 13:11:35 -04:00
|
|
|
expectBOXE t =
|
|
|
|
let Val n = ctx.termLen in
|
|
|
|
expectBOX_ (toTyContext ctx) (shift0 ctx.dimLen) t
|