Scoped pure Fω terms
Terms and contexts
InductiveScoped pure Fω terms#✓fully proved
Pure terms at a kind telescope and a finite term-variable depth.
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
inductive Kind where
| star : Kind
| arrow : Kind → Kind → Kind
deriving DecidableEq, Repr
CSLibExt/Languages/LambdaCalculus/FOmega/Syntax.lean:37
inductive Ty : List Kind → Kind → Type where
| var {Δ : List Kind} {κ : Kind} : KVar Δ κ → Ty Δ κ
| lam {Δ : List Kind} {κ μ : Kind} :
Ty (κ :: Δ) μ → Ty Δ (.arrow κ μ)
| app {Δ : List Kind} {κ μ : Kind} :
Ty Δ (.arrow κ μ) → Ty Δ κ → Ty Δ μ
| arr {Δ : List Kind} : Ty Δ .star → Ty Δ .star → Ty Δ .star
| all {Δ : List Kind} {κ : Kind} : Ty (κ :: Δ) .star → Ty Δ .star
CSLibExt/Languages/LambdaCalculus/FOmega/Syntax.lean:61
Uses 2 · Used by 63
AbbreviationTerm contexts of pure Fω#✓fully proved
An ordered unrestricted term context of kind-star types.
abbrev Ctx (Δ : List Kind) (m : Nat) := Fin m → Ty Δ .star
inductive Kind where
| star : Kind
| arrow : Kind → Kind → Kind
deriving DecidableEq, Repr
CSLibExt/Languages/LambdaCalculus/FOmega/Syntax.lean:37
inductive Ty : List Kind → Kind → Type where
| var {Δ : List Kind} {κ : Kind} : KVar Δ κ → Ty Δ κ
| lam {Δ : List Kind} {κ μ : Kind} :
Ty (κ :: Δ) μ → Ty Δ (.arrow κ μ)
| app {Δ : List Kind} {κ μ : Kind} :
Ty Δ (.arrow κ μ) → Ty Δ κ → Ty Δ μ
| arr {Δ : List Kind} : Ty Δ .star → Ty Δ .star → Ty Δ .star
| all {Δ : List Kind} {κ : Kind} : Ty (κ :: Δ) .star → Ty Δ .star
CSLibExt/Languages/LambdaCalculus/FOmega/Syntax.lean:61
Uses 2 · Used by 19
Renaming and substitution in terms
DefinitionType substitution in Fω terms#✓fully proved
Substitute kinded type variables in all annotations and type arguments.
@[simp] def tySubst {Δ Ε : List Kind} {m : Nat} (σ : Ty.Sub Δ Ε) :
Tm Δ m → Tm Ε m
| .var i => .var i
| .lam A b => .lam (A.subst σ) (tySubst σ b)
| .app f a => .app (tySubst σ f) (tySubst σ a)
| .tabs b => .tabs (tySubst (Ty.liftSub σ) b)
| .tapp f A => .tapp (tySubst σ f) (A.subst σ)
inductive Kind where
| star : Kind
| arrow : Kind → Kind → Kind
deriving DecidableEq, Repr
CSLibExt/Languages/LambdaCalculus/FOmega/Syntax.lean:37
abbrev Sub (Δ Ε : List Kind) := ∀ {κ}, KVar Δ κ → Ty Ε κ
CSLibExt/Languages/LambdaCalculus/FOmega/Syntax.lean:82
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
def liftSub {Δ Ε : List Kind} {μ : Kind} (σ : Sub Δ Ε) :
Sub (μ :: Δ) (μ :: Ε)
| _, .zero => .var .zero
| _, .succ x => rename KVar.succ (σ x)
CSLibExt/Languages/LambdaCalculus/FOmega/Syntax.lean:85
Uses 6 · Used by 15
DefinitionType-variable renaming in Fω terms#✓fully proved
Rename type variables without changing term variables.
def tyRename {Δ Ε : List Kind} {m : Nat} (ρ : KRen Δ Ε) (t : Tm Δ m) :
Tm Ε m := tySubst (fun {_} x => .var (ρ x)) t
inductive Kind where
| star : Kind
| arrow : Kind → Kind → Kind
deriving DecidableEq, Repr
CSLibExt/Languages/LambdaCalculus/FOmega/Syntax.lean:37
abbrev KRen (Δ Ε : List Kind) := ∀ {κ}, KVar Δ κ → KVar Ε κ
CSLibExt/Languages/LambdaCalculus/FOmega/Syntax.lean:48
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
@[simp] def tySubst {Δ Ε : List Kind} {m : Nat} (σ : Ty.Sub Δ Ε) :
Tm Δ m → Tm Ε m
| .var i => .var i
| .lam A b => .lam (A.subst σ) (tySubst σ b)
| .app f a => .app (tySubst σ f) (tySubst σ a)
| .tabs b => .tabs (tySubst (Ty.liftSub σ) b)
| .tapp f A => .tapp (tySubst σ f) (A.subst σ)
CSLibExt/Languages/LambdaCalculus/FOmega/Terms.lean:42
Uses 6 · Used by 5
DefinitionTerm-variable renaming in Fω terms#✓fully proved
Rename term variables, lifting only beneath term lambdas.
@[simp] def rename {Δ : List Kind} {m k : Nat} (ρ : Fin m → Fin k) :
Tm Δ m → Tm Δ k
| .var i => .var (ρ i)
| .lam A b => .lam A (rename (SystemF.liftRen ρ) b)
| .app f a => .app (rename ρ f) (rename ρ a)
| .tabs b => .tabs (rename ρ b)
| .tapp f A => .tapp (rename ρ f) A
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
def liftRen {n k : Nat} (ρ : Fin n → Fin k) :
Fin (n + 1) → Fin (k + 1) :=
Fin.cases 0 (fun i => (ρ i).succ)
CSLibExt/Languages/LambdaCalculus/SystemF/Syntax.lean:38
Uses 4 · Used by 4
DefinitionLifting a term substitution under a term binder#✓fully proved
Lift a term substitution beneath one term binder.
def liftSub {Δ : List Kind} {m k : Nat} (σ : Fin m → Tm Δ k) :
Fin (m + 1) → Tm Δ (k + 1) :=
Fin.cases (.var 0) (fun i => rename Fin.succ (σ i))
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
@[simp] def rename {Δ : List Kind} {m k : Nat} (ρ : Fin m → Fin k) :
Tm Δ m → Tm Δ k
| .var i => .var (ρ i)
| .lam A b => .lam A (rename (SystemF.liftRen ρ) b)
| .app f a => .app (rename ρ f) (rename ρ a)
| .tabs b => .tabs (rename ρ b)
| .tapp f A => .tapp (rename ρ f) A
CSLibExt/Languages/LambdaCalculus/FOmega/Terms.lean:55
DefinitionSimultaneous term substitution in Fω#✓fully proved
Term substitution avoids capture in both namespaces.
@[simp] def subst {Δ : List Kind} {m k : Nat} (σ : Fin m → Tm Δ k) :
Tm Δ m → Tm Δ k
| .var i => σ i
| .lam A b => .lam A (subst (liftSub σ) b)
| .app f a => .app (subst σ f) (subst σ a)
| .tabs b => .tabs (subst (fun i => tyRename KVar.succ (σ i)) b)
| .tapp f A => .tapp (subst σ f) A
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
def liftSub {Δ : List Kind} {m k : Nat} (σ : Fin m → Tm Δ k) :
Fin (m + 1) → Tm Δ (k + 1) :=
Fin.cases (.var 0) (fun i => rename Fin.succ (σ i))
CSLibExt/Languages/LambdaCalculus/FOmega/Terms.lean:64
def tyRename {Δ Ε : List Kind} {m : Nat} (ρ : KRen Δ Ε) (t : Tm Δ m) :
Tm Ε m := tySubst (fun {_} x => .var (ρ x)) t
CSLibExt/Languages/LambdaCalculus/FOmega/Terms.lean:51
inductive KVar : List Kind → Kind → Type where
| zero {Δ : List Kind} {κ : Kind} : KVar (κ :: Δ) κ
| succ {Δ : List Kind} {κ μ : Kind} : KVar Δ κ → KVar (μ :: Δ) κ
CSLibExt/Languages/LambdaCalculus/FOmega/Syntax.lean:43
Uses 6 · Used by 6
DefinitionInstantiation of an Fω term binder#✓fully proved
Discharge the newest term binder.
def instantiate {Δ : List Kind} {m : Nat} (b : Tm Δ (m + 1))
(a : Tm Δ m) : Tm Δ m := subst (Fin.cases a Tm.var) b
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
@[simp] def subst {Δ : List Kind} {m k : Nat} (σ : Fin m → Tm Δ k) :
Tm Δ m → Tm Δ k
| .var i => σ i
| .lam A b => .lam A (subst (liftSub σ) b)
| .app f a => .app (subst σ f) (subst σ a)
| .tabs b => .tabs (subst (fun i => tyRename KVar.succ (σ i)) b)
| .tapp f A => .tapp (subst σ f) A
CSLibExt/Languages/LambdaCalculus/FOmega/Terms.lean:69
Uses 3 · Used by 9
Loading dependency explorer…
The dependency explorer needs JavaScript and its graph data.