Fω weak-CBV erasure into the existing full-beta term model
TheoremErasure of an Fω evaluation step is a beta conversion#✓fully proved
Every actual Fω CBV step preserves beta conversion of arbitrary closing instances.
theorem erasure_step {Δ : List Kind} {m : Nat} {t t' : Tm Δ m}
(hs : Step t t') (σ : Fin m → SystemF.Model) :
SystemF.BetaEq (Tm.close σ t) (Tm.close σ t')
inductive Kind where
| star : Kind
| arrow : Kind → Kind → Kind
deriving DecidableEq, Repr
CSLibExt/Languages/LambdaCalculus/FOmega/Syntax.lean:37
inductive Tm : List Kind → Nat → Type where
| var {Δ : List Kind} {m : Nat} : Fin m → Tm Δ m
| lam {Δ : List Kind} {m : Nat} : Ty Δ .star → Tm Δ (m + 1) → Tm Δ m
| app {Δ : List Kind} {m : Nat} : Tm Δ m → Tm Δ m → Tm Δ m
| tabs {Δ : List Kind} {m : Nat} {κ : Kind} : Tm (κ :: Δ) m → Tm Δ m
| tapp {Δ : List Kind} {m : Nat} {κ : Kind} : Tm Δ m → Ty Δ κ → Tm Δ m
CSLibExt/Languages/LambdaCalculus/FOmega/Terms.lean:29
inductive Step : {Δ : List Kind} → {m : Nat} → Tm Δ m → Tm Δ m → Prop where
| beta {Δ : List Kind} {m : Nat} {A : Ty Δ .star}
{b : Tm Δ (m + 1)} {a : Tm Δ m} :
Value a → Step (.app (.lam A b) a) (b.instantiate a)
| tybeta {Δ : List Kind} {m : Nat} {κ : Kind}
(b : Tm (κ :: Δ) m) (a : Ty Δ κ) :
Step (.tapp (.tabs b) a) (b.tySubst (Ty.single a))
| appFun {Δ : List Kind} {m : Nat} {f f' a : Tm Δ m} :
Step f f' → Step (.app f a) (.app f' a)
| appArg {Δ : List Kind} {m : Nat} {f a a' : Tm Δ m} :
Value f → Step a a' → Step (.app f a) (.app f a')
| tapp {Δ : List Kind} {m : Nat} {κ : Kind}
⋯
CSLibExt/Languages/LambdaCalculus/FOmega/Safety.lean:31
abbrev Model : Type := {t : Term Nat // t.LcAt 0}
CSLibExt/Languages/LambdaCalculus/SystemF/Model.lean:27
abbrev BetaEq (f g : Model) : Prop :=
Relation.EqvGen Term.FullBeta f.val g.val
CSLibExt/Languages/LambdaCalculus/SystemF/Model.lean:30
def close (σ : Fin m → SystemF.Model) (t : Tm Δ m) : SystemF.Model :=
SystemF.Tm.close σ (eraseSyntax t)
CSLibExt/Languages/LambdaCalculus/FOmega/Closing.lean:26
Uses 21 · Used by 1
TheoremErasure of multistep Fω evaluation is a beta conversion#✓fully proved
Finite Fω evaluation preserves beta conversion of the closing instances.
theorem erasure_steps {Δ : List Kind} {m : Nat} {t t' : Tm Δ m}
(hs : Relation.ReflTransGen Step t t') (σ : Fin m → SystemF.Model) :
SystemF.BetaEq (Tm.close σ t) (Tm.close σ t')
inductive Kind where
| star : Kind
| arrow : Kind → Kind → Kind
deriving DecidableEq, Repr
CSLibExt/Languages/LambdaCalculus/FOmega/Syntax.lean:37
inductive Tm : List Kind → Nat → Type where
| var {Δ : List Kind} {m : Nat} : Fin m → Tm Δ m
| lam {Δ : List Kind} {m : Nat} : Ty Δ .star → Tm Δ (m + 1) → Tm Δ m
| app {Δ : List Kind} {m : Nat} : Tm Δ m → Tm Δ m → Tm Δ m
| tabs {Δ : List Kind} {m : Nat} {κ : Kind} : Tm (κ :: Δ) m → Tm Δ m
| tapp {Δ : List Kind} {m : Nat} {κ : Kind} : Tm Δ m → Ty Δ κ → Tm Δ m
CSLibExt/Languages/LambdaCalculus/FOmega/Terms.lean:29
inductive Step : {Δ : List Kind} → {m : Nat} → Tm Δ m → Tm Δ m → Prop where
| beta {Δ : List Kind} {m : Nat} {A : Ty Δ .star}
{b : Tm Δ (m + 1)} {a : Tm Δ m} :
Value a → Step (.app (.lam A b) a) (b.instantiate a)
| tybeta {Δ : List Kind} {m : Nat} {κ : Kind}
(b : Tm (κ :: Δ) m) (a : Ty Δ κ) :
Step (.tapp (.tabs b) a) (b.tySubst (Ty.single a))
| appFun {Δ : List Kind} {m : Nat} {f f' a : Tm Δ m} :
Step f f' → Step (.app f a) (.app f' a)
| appArg {Δ : List Kind} {m : Nat} {f a a' : Tm Δ m} :
Value f → Step a a' → Step (.app f a) (.app f a')
| tapp {Δ : List Kind} {m : Nat} {κ : Kind}
⋯
CSLibExt/Languages/LambdaCalculus/FOmega/Safety.lean:31
abbrev Model : Type := {t : Term Nat // t.LcAt 0}
CSLibExt/Languages/LambdaCalculus/SystemF/Model.lean:27
abbrev BetaEq (f g : Model) : Prop :=
Relation.EqvGen Term.FullBeta f.val g.val
CSLibExt/Languages/LambdaCalculus/SystemF/Model.lean:30
def close (σ : Fin m → SystemF.Model) (t : Tm Δ m) : SystemF.Model :=
SystemF.Tm.close σ (eraseSyntax t)
CSLibExt/Languages/LambdaCalculus/FOmega/Closing.lean:26
Loading dependency explorer…
The dependency explorer needs JavaScript and its graph data.