Implementation of simultaneous substitutions following Schäfer/Tebbi/Smolka in Autosubst: Reasoning with de Bruijn Terms and Parallel Substitution.
Renaming #
Rename the de Bruijn indices in an expression.
Equations
- Expr.rename ξ (Expr.ax c A) = Expr.ax c (Expr.rename ξ A)
- Expr.rename ξ (Expr.bvar i) = Expr.bvar (ξ i)
- Expr.rename ξ (Expr.pi l l' A B) = Expr.pi l l' (Expr.rename ξ A) (Expr.rename (Expr.upr ξ) B)
- Expr.rename ξ (Expr.sigma l l' A B) = Expr.sigma l l' (Expr.rename ξ A) (Expr.rename (Expr.upr ξ) B)
- Expr.rename ξ (Expr.lam l l' A t) = Expr.lam l l' (Expr.rename ξ A) (Expr.rename (Expr.upr ξ) t)
- Expr.rename ξ (Expr.app l l' B fn arg) = Expr.app l l' (Expr.rename (Expr.upr ξ) B) (Expr.rename ξ fn) (Expr.rename ξ arg)
- Expr.rename ξ (Expr.pair l l' B t u) = Expr.pair l l' (Expr.rename (Expr.upr ξ) B) (Expr.rename ξ t) (Expr.rename ξ u)
- Expr.rename ξ (Expr.fst l l' A B p) = Expr.fst l l' (Expr.rename ξ A) (Expr.rename (Expr.upr ξ) B) (Expr.rename ξ p)
- Expr.rename ξ (Expr.snd l l' A B p) = Expr.snd l l' (Expr.rename ξ A) (Expr.rename (Expr.upr ξ) B) (Expr.rename ξ p)
- Expr.rename ξ (Expr.Id l A t u) = Expr.Id l (Expr.rename ξ A) (Expr.rename ξ t) (Expr.rename ξ u)
- Expr.rename ξ (Expr.refl l t) = Expr.refl l (Expr.rename ξ t)
- Expr.rename ξ (Expr.idRec l l' t C r u h) = Expr.idRec l l' (Expr.rename ξ t) (Expr.rename (Expr.upr (Expr.upr ξ)) C) (Expr.rename ξ r) (Expr.rename ξ u) (Expr.rename ξ h)
- Expr.rename ξ (Expr.univ l) = Expr.univ l
- Expr.rename ξ a.el = (Expr.rename ξ a).el
- Expr.rename ξ A.code = (Expr.rename ξ A).code
Instances For
Substitution #
@[irreducible]
Lift a substitution under a binder.
Δ ⊢ σ : Γ Γ ⊢ A
------------------------
Δ.A[σ] ⊢ (↑≫σ).v₀ : Γ.A
Warning: don't unfold this definition! Use up_eq_snoc
instead.
Instances For
Apply a substitution to an expression.
Equations
- Expr.subst σ (Expr.ax c A) = Expr.ax c (Expr.subst σ A)
- Expr.subst σ (Expr.bvar i) = σ i
- Expr.subst σ (Expr.pi l l' A B) = Expr.pi l l' (Expr.subst σ A) (Expr.subst (Expr.up σ) B)
- Expr.subst σ (Expr.sigma l l' A B) = Expr.sigma l l' (Expr.subst σ A) (Expr.subst (Expr.up σ) B)
- Expr.subst σ (Expr.lam l l' A t) = Expr.lam l l' (Expr.subst σ A) (Expr.subst (Expr.up σ) t)
- Expr.subst σ (Expr.app l l' B fn arg) = Expr.app l l' (Expr.subst (Expr.up σ) B) (Expr.subst σ fn) (Expr.subst σ arg)
- Expr.subst σ (Expr.pair l l' B t u) = Expr.pair l l' (Expr.subst (Expr.up σ) B) (Expr.subst σ t) (Expr.subst σ u)
- Expr.subst σ (Expr.fst l l' A B p) = Expr.fst l l' (Expr.subst σ A) (Expr.subst (Expr.up σ) B) (Expr.subst σ p)
- Expr.subst σ (Expr.snd l l' A B p) = Expr.snd l l' (Expr.subst σ A) (Expr.subst (Expr.up σ) B) (Expr.subst σ p)
- Expr.subst σ (Expr.Id l A t u) = Expr.Id l (Expr.subst σ A) (Expr.subst σ t) (Expr.subst σ u)
- Expr.subst σ (Expr.refl l t) = Expr.refl l (Expr.subst σ t)
- Expr.subst σ (Expr.idRec l l' t C r u h) = Expr.idRec l l' (Expr.subst σ t) (Expr.subst (Expr.up (Expr.up σ)) C) (Expr.subst σ r) (Expr.subst σ u) (Expr.subst σ h)
- Expr.subst σ (Expr.univ l) = Expr.univ l
- Expr.subst σ a.el = (Expr.subst σ a).el
- Expr.subst σ A.code = (Expr.subst σ A).code
Instances For
Decision procedure #
Decides equality of substitutions applied to expressions.
Equations
- Expr.tacticAutosubst = Lean.ParserDescr.node `Expr.tacticAutosubst 1024 (Lean.ParserDescr.nonReservedSymbol "autosubst" false)
Instances For
Use a term modulo autosubst
conversion.
Equations
- Expr.«termAutosubst%_» = Lean.ParserDescr.node `Expr.«termAutosubst%_» 1022 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol "autosubst% ") (Lean.ParserDescr.cat `term 0))
Instances For
Lemmas that come up in a few proofs
Closed expressions #
The expression uses only indices up to k
.
Equations
- Expr.isClosed k (Expr.univ l) = true
- Expr.isClosed k (Expr.ax c A) = Expr.isClosed k A
- Expr.isClosed k (Expr.bvar i) = decide (i < k)
- Expr.isClosed k (Expr.refl l t) = Expr.isClosed k t
- Expr.isClosed k t.el = Expr.isClosed k t
- Expr.isClosed k t.code = Expr.isClosed k t
- Expr.isClosed k (Expr.pi l l' t b) = (Expr.isClosed k t && Expr.isClosed (k + 1) b)
- Expr.isClosed k (Expr.sigma l l' t b) = (Expr.isClosed k t && Expr.isClosed (k + 1) b)
- Expr.isClosed k (Expr.lam l l' t b) = (Expr.isClosed k t && Expr.isClosed (k + 1) b)
- Expr.isClosed k (Expr.app l l' b t u) = (Expr.isClosed (k + 1) b && Expr.isClosed k t && Expr.isClosed k u)
- Expr.isClosed k (Expr.pair l l' b t u) = (Expr.isClosed (k + 1) b && Expr.isClosed k t && Expr.isClosed k u)
- Expr.isClosed k (Expr.fst l l' t b u) = (Expr.isClosed (k + 1) b && Expr.isClosed k t && Expr.isClosed k u)
- Expr.isClosed k (Expr.snd l l' t b u) = (Expr.isClosed (k + 1) b && Expr.isClosed k t && Expr.isClosed k u)
- Expr.isClosed k (Expr.Id l A t u) = (Expr.isClosed k A && Expr.isClosed k t && Expr.isClosed k u)
- Expr.isClosed k (Expr.idRec l l' t M r u h) = (Expr.isClosed k t && Expr.isClosed (k + 2) M && Expr.isClosed k r && Expr.isClosed k u && Expr.isClosed k h)