summaryrefslogtreecommitdiff
path: root/src/Core/Reducible.idr
diff options
context:
space:
mode:
Diffstat (limited to 'src/Core/Reducible.idr')
-rw-r--r--src/Core/Reducible.idr385
1 files changed, 385 insertions, 0 deletions
diff --git a/src/Core/Reducible.idr b/src/Core/Reducible.idr
new file mode 100644
index 0000000..fe31a7a
--- /dev/null
+++ b/src/Core/Reducible.idr
@@ -0,0 +1,385 @@
+module Core.Reducible
+
+import Control.WellFounded
+
+import Core.Declarative
+import Core.Environment
+import Core.Generic
+import Core.Reduction
+import Core.Term
+import Core.Term.Substitution
+import Core.Term.Thinned
+import Core.Term.NormalForm
+import Core.Thinning
+
+%prefix_record_projections off
+
+data Level = Small | Large
+
+%name Level l
+
+Sized Level where
+ size Small = 0
+ size Large = 1
+
+record LogicalRelation (eq : Equality) where
+ constructor MkLogRel
+ 0 TypeRed : forall n. Env n -> Term n -> Type
+ 0 TypeEq : forall n. (env : Env n) -> (a, b : Term n) -> TypeRed {n} env a -> Type
+ 0 TermRed : forall n. (env : Env n) -> (t, a : Term n) -> TypeRed {n} env a -> Type
+ 0 TermEq : forall n. (env : Env n) -> (t, u, a : Term n) -> TypeRed {n} env a -> Type
+
+data TypeRed :
+ (eq : Equality) ->
+ (l : Level) ->
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq) ->
+ (env : Env n) ->
+ (a : Term n) ->
+ Type
+data TypeEq :
+ (eq : Equality) ->
+ (l : Level) ->
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq) ->
+ (env : Env n) ->
+ (a, b : Term n) ->
+ TypeRed eq l rec {n} env a ->
+ Type
+data TermRed :
+ (eq : Equality) ->
+ (l : Level) ->
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq) ->
+ (env : Env n) ->
+ (t, a : Term n) ->
+ TypeRed eq l rec {n} env a ->
+ Type
+data TermEq :
+ (eq : Equality) ->
+ (l : Level) ->
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq) ->
+ (env : Env n) ->
+ (t, u, a : Term n) ->
+ TypeRed eq l rec {n} env a ->
+ Type
+
+-- -- Neutrals
+
+record NeutralTyRed
+ (eq : Equality)
+ (l : Level)
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq)
+ (env : Env n)
+ (a : Term n)
+ where
+ constructor MkNtrlTyRed
+ {0 a' : Term n}
+ tyWf : TypeWf env a
+ steps : TypeReduce env a a'
+ tyWf' : TypeWf env a'
+ 0 ntrl : Neutral a'
+ prf : eq.NtrlEq env (Element a' ntrl) (Element a' ntrl) Set
+
+record NeutralTyEq
+ (eq : Equality)
+ (l : Level)
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq)
+ (env : Env n)
+ (a, b : Term n)
+ (red : NeutralTyRed eq l rec {n} env a)
+ where
+ constructor MkNtrlTyEq
+ {0 b' : Term n}
+ tyWf : TypeWf env b
+ steps : TypeReduce env b b'
+ tyWf' : TypeWf env b'
+ 0 ntrl : Neutral b'
+ prf : eq.NtrlEq env (Element red.a' red.ntrl) (Element b' ntrl) Set
+
+record NeutralTmRed
+ (eq : Equality)
+ (l : Level)
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq)
+ (env : Env n)
+ (t, a : Term n)
+ (red : NeutralTyRed eq l rec {n} env a)
+ where
+ constructor MkNtrlTmRed
+ {0 t' : Term n}
+ tmWf : TermWf env t a
+ steps : TermReduce env t t' a
+ tmWf' : TermWf env t' a
+ 0 ntrl : Neutral t'
+ prf : eq.NtrlEq env (Element t' ntrl) (Element t' ntrl) a
+
+record NeutralTmEq
+ (eq : Equality)
+ (l : Level)
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq)
+ (env : Env n)
+ (t, u, a : Term n)
+ (red : NeutralTyRed eq l rec {n} env a)
+ where
+ constructor MkNtrlTmEq
+ {0 t', u' : Term n}
+ tmWf1 : TermWf env t a
+ tmWf2 : TermWf env u a
+ steps1 : TermReduce env t t' a
+ steps2 : TermReduce env u u' a
+ tmWf1' : TermWf env t' a
+ tmWf2' : TermWf env u' a
+ 0 ntrl1 : Neutral t'
+ 0 ntrl2 : Neutral u'
+ prf : eq.NtrlEq env (Element t' ntrl1) (Element u' ntrl2) a
+
+-- Set
+
+record SetTyRed
+ (eq : Equality)
+ (l : Level)
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq)
+ (env : Env n)
+ (a : Term n)
+ where
+ constructor MkSetTyRed
+ tyWf : TypeWf env a
+ steps : TypeReduce env a Set
+ tyWf' : TypeWf env Set
+ prf : Smaller Small l
+
+record SetTyEq
+ (eq : Equality)
+ (l : Level)
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq)
+ (env : Env n)
+ (a, b : Term n)
+ (red : SetTyRed eq l rec {n} env a)
+ where
+ constructor MkSetTyEq
+ tyWf : TypeWf env b
+ steps : TypeReduce env b Set
+ tyWf' : TypeWf env Set
+
+record SetTmRed
+ (eq : Equality)
+ (l : Level)
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq)
+ (env : Env n)
+ (t, a : Term n)
+ (red : SetTyRed eq l rec {n} env a)
+ where
+ constructor MkSetTmRed
+ {0 t' : Term n}
+ tmWf : TermWf env t a
+ steps : TypeReduce env t t'
+ tyWf' : TermWf env t' a
+ 0 whnf : Whnf t'
+ prf : eq.TermEq env t' t' a
+ tyRed : (rec Small red.prf).TypeRed env t
+
+record SetTmEq
+ (eq : Equality)
+ (l : Level)
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq)
+ (env : Env n)
+ (t, u, a : Term n)
+ (red : SetTyRed eq l rec {n} env a)
+ where
+ constructor MkSetTmEq
+ {0 t', u' : Term n}
+ tmWf1 : TermWf env t a
+ tmWf2 : TermWf env u a
+ steps1 : TypeReduce env t t'
+ steps2 : TypeReduce env u u'
+ tyWf1' : TermWf env t' Set
+ tyWf2' : TermWf env u' Set
+ 0 whnf1 : Whnf t'
+ 0 whnf2 : Whnf u'
+ prf : eq.TermEq env t' u' a
+ tyRed1 : (rec Small red.prf).TypeRed env t
+ tyRed2 : (rec Small red.prf).TypeRed env u
+ tyEq : (rec Small red.prf).TypeEq env t u tyRed1
+
+-- Pi
+
+record PiTyRed
+ (eq : Equality)
+ (l : Level)
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq)
+ (env : Env n)
+ (a : Term n)
+ where
+ constructor MkPiTyRed
+ {0 f : Term n}
+ {0 g : Term (S n)}
+ tyWf : TypeWf env a
+ steps : TypeReduce env a (Pi f g)
+ tyWf' : TypeWf env (Pi f g)
+ domWf : TypeWf env f
+ codWf : TypeWf (env :< pure f) g
+ domRed :
+ forall m.
+ {0 thin : n `Thins` m} ->
+ forall env'.
+ ExtendsWf thin env' env ->
+ TypeRed eq l rec env' (wkn f thin)
+ codRed :
+ forall m.
+ {0 thin : n `Thins` m} ->
+ forall env'.
+ (thinWf : ExtendsWf thin env' env) ->
+ forall t.
+ TermRed eq l rec env' t (wkn f thin) (domRed thinWf) ->
+ TypeRed eq l rec env' (subst g (Wkn thin :< pure t))
+ codEq :
+ forall m.
+ {0 thin : n `Thins` m} ->
+ forall env'.
+ (thinWf : ExtendsWf thin env' env) ->
+ forall t, u.
+ (red : TermRed eq l rec env' t (wkn f thin) (domRed thinWf)) ->
+ TermRed eq l rec env' u (wkn f thin) (domRed thinWf) ->
+ TermEq eq l rec env' t u (wkn f thin) (domRed thinWf) ->
+ TypeEq eq l rec env'
+ (subst g (Wkn thin :< pure t))
+ (subst g (Wkn thin :< pure u))
+ (codRed thinWf red)
+
+record PiTyEq
+ (eq : Equality)
+ (l : Level)
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq)
+ (env : Env n)
+ (a, b : Term n)
+ (red : PiTyRed eq l rec env a)
+ where
+ constructor MkPiTyEq
+ {0 f : Term n}
+ {0 g : Term (S n)}
+ tyWf : TypeWf env b
+ steps : TypeReduce env b (Pi f g)
+ tyWf' : TypeWf env (Pi f g)
+ prf : eq.TypeEq env (Pi red.f red.g) (Pi f g)
+ domEq :
+ forall m.
+ {0 thin : n `Thins` m} ->
+ forall env'.
+ (thinWf : ExtendsWf thin env' env) ->
+ TypeEq eq l rec env' (wkn red.f thin) (wkn f thin) (red.domRed thinWf)
+ codEq :
+ forall m.
+ {0 thin : n `Thins` m} ->
+ forall env'.
+ (thinWf : ExtendsWf thin env' env) ->
+ forall t.
+ (red' : TermRed eq l rec env' t (wkn red.f thin) (red.domRed thinWf)) ->
+ TypeEq eq l rec env'
+ (subst red.g (Wkn thin :< pure t))
+ (subst g (Wkn thin :< pure t))
+ (red.codRed thinWf red')
+
+record PiTmRed
+ (eq : Equality)
+ (l : Level)
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq)
+ (env : Env n)
+ (t, a : Term n)
+ (red : PiTyRed eq l rec env a)
+ where
+ constructor MkPiTmRed
+ {0 t' : Term n}
+ tmWf : TermWf env t a
+ steps : TermReduce env t t' a
+ tmWf' : TermWf env t' a
+ 0 whnf : Whnf t'
+ prf : eq.TermEq env t' t' a
+ codRed :
+ forall m.
+ {0 thin : n `Thins` m} ->
+ forall env'.
+ (thinWf : ExtendsWf thin env' env) ->
+ forall u.
+ (red' : TermRed eq l rec env' u (wkn red.f thin) (red.domRed thinWf)) ->
+ TermRed eq l rec env'
+ (App (wkn t' thin) u)
+ (subst red.g (Wkn thin :< pure u))
+ (red.codRed thinWf red')
+ codEq :
+ forall m.
+ {0 thin : n `Thins` m} ->
+ forall env'.
+ (thinWf : ExtendsWf thin env' env) ->
+ forall u, v.
+ (red' : TermRed eq l rec env' u (wkn red.f thin) (red.domRed thinWf)) ->
+ TermRed eq l rec env' v (wkn red.f thin) (red.domRed thinWf) ->
+ TermEq eq l rec env' u v (wkn red.f thin) (red.domRed thinWf) ->
+ TermEq eq l rec env'
+ (App (wkn t' thin) u)
+ (App (wkn t' thin) v)
+ (subst red.g (Wkn thin :< pure u))
+ (red.codRed thinWf red')
+
+record PiTmEq
+ (eq : Equality)
+ (l : Level)
+ (rec : (l' : Level) -> Smaller l' l -> LogicalRelation eq)
+ (env : Env n)
+ (t, u, a : Term n)
+ (red : PiTyRed eq l rec env a)
+ where
+ constructor MkPiTmEq
+ {0 t', u' : Term n}
+ tmWf1 : TermWf env t a
+ tmWf2 : TermWf env u a
+ steps1 : TermReduce env t t' a
+ steps2 : TermReduce env u u' a
+ tmWf1' : TermWf env t' a
+ tmWf2' : TermWf env u' a
+ 0 whnf1 : Whnf t'
+ 0 whnf2 : Whnf u'
+ prf : eq.TermEq env t' u' a
+ red1 : PiTmRed eq l rec env t a red
+ red2 : PiTmRed eq l rec env u a red
+ codEq :
+ forall m.
+ {0 thin : n `Thins` m} ->
+ forall env'.
+ (thinWf : ExtendsWf thin env' env) ->
+ forall v.
+ (red' : TermRed eq l rec env' v (wkn red.f thin) (red.domRed thinWf)) ->
+ TermEq eq l rec env'
+ (App (wkn t' thin) v)
+ (App (wkn u' thin) v)
+ (subst red.g (Wkn thin :< pure v))
+ (red.codRed thinWf red')
+
+-- Putting it all together
+
+data TypeRed where
+ RedNtrlTy : NeutralTyRed eq l rec env a -> TypeRed eq l rec env a
+ RedSetTy : SetTyRed eq l rec env a -> TypeRed eq l rec env a
+ RedPiTy : PiTyRed eq l rec env a -> TypeRed eq l rec env a
+
+data TypeEq where
+ EqNtrlTy : NeutralTyEq eq l rec env a b red -> TypeEq eq l rec env a b (RedNtrlTy red)
+ EqSetTy : SetTyEq eq l rec env a b red -> TypeEq eq l rec env a b (RedSetTy red)
+ EqPiTy : PiTyEq eq l rec env a b red -> TypeEq eq l rec env a b (RedPiTy red)
+
+data TermRed where
+ RedNtrlTm : NeutralTmRed eq l rec env t a red -> TermRed eq l rec env t a (RedNtrlTy red)
+ RedSetTm : SetTmRed eq l rec env t a red -> TermRed eq l rec env t a (RedSetTy red)
+ RedPiTm : PiTmRed eq l rec env t a red -> TermRed eq l rec env t a (RedPiTy red)
+
+data TermEq where
+ EqNtrlTm : NeutralTmEq eq l rec env t u a red -> TermEq eq l rec env t u a (RedNtrlTy red)
+ EqSetTm : SetTmEq eq l rec env t u a red -> TermEq eq l rec env t u a (RedSetTy red)
+ EqPiTm : PiTmEq eq l rec env t u a red -> TermEq eq l rec env t u a (RedPiTy red)
+
+-- Induction -------------------------------------------------------------------
+
+LogRel : (eq : Equality) -> Level -> LogicalRelation eq
+LogRel eq =
+ sizeRec $ \l, rec =>
+ MkLogRel
+ (TypeRed eq l rec)
+ (TypeEq eq l rec)
+ (TermRed eq l rec)
+ (TermEq eq l rec)