λ-calculus #
The untyped λ-calculus, with a named representation of variables. This file contains the definitions of α-equivalence and capture-avoiding substitution.
References #
Equations
- One or more equations did not get rendered due to their size.
- Cslib.LambdaCalculus.Named.Untyped.instDecidableEqTerm.decEq (Cslib.LambdaCalculus.Named.Untyped.Term.var x_2) (Cslib.LambdaCalculus.Named.Untyped.Term.abs x_3 m) = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.instDecidableEqTerm.decEq (Cslib.LambdaCalculus.Named.Untyped.Term.var x_2) (m.app n) = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.instDecidableEqTerm.decEq (Cslib.LambdaCalculus.Named.Untyped.Term.abs x_2 m) (Cslib.LambdaCalculus.Named.Untyped.Term.var x_3) = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.instDecidableEqTerm.decEq (Cslib.LambdaCalculus.Named.Untyped.Term.abs x_2 m) (m_1.app n) = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.instDecidableEqTerm.decEq (m.app n) (Cslib.LambdaCalculus.Named.Untyped.Term.var x_2) = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.instDecidableEqTerm.decEq (m.app n) (Cslib.LambdaCalculus.Named.Untyped.Term.abs x_2 m_1) = isFalse ⋯
Instances For
Free variables.
Equations
Instances For
Variable names (free and bound) in a term.
Equations
Instances For
Variable renaming, applying to both free and bound variables.
m.rename x y changes all occurrences of x into y in m.
Equations
- (Cslib.LambdaCalculus.Named.Untyped.Term.var x_2).rename x y = Cslib.LambdaCalculus.Named.Untyped.Term.var (if x_2 = x then y else x_2)
- (Cslib.LambdaCalculus.Named.Untyped.Term.abs x_2 m_1).rename x y = Cslib.LambdaCalculus.Named.Untyped.Term.abs (if x_2 = x then y else x_2) (m_1.rename x y)
- (m_1.app n).rename x y = (m_1.rename x y).app (n.rename x y)
Instances For
Renaming preserves size.
α-equivalence.
- var {Var : Type u} [DecidableEq Var] {x : Var} : (Term.var x).AlphaEquiv (Term.var x)
- abs {Var : Type u} [DecidableEq Var] {y x1 x2 : Var} {m1 m2 : Term Var} : y ∉ m1.vars ∪ m2.vars ∪ {x1, x2} → (m1.rename x1 y).AlphaEquiv (m2.rename x2 y) → (Term.abs x1 m1).AlphaEquiv (Term.abs x2 m2)
- app {Var : Type u} [DecidableEq Var] {m1 n1 m2 n2 : Term Var} : m1.AlphaEquiv n1 → m2.AlphaEquiv n2 → (m1.app m2).AlphaEquiv (n1.app n2)
Instances For
Instance for the notation m =α n.
Allow grind to recognise the notation of α-equivalence.
Capture-avoiding substitution, as an inference system.
- varHit {Var : Type u} [DecidableEq Var] {x : Var} {r : Term Var} : (var x).Subst x r r
- varMiss {Var : Type u} [DecidableEq Var] {x y : Var} {r : Term Var} : y ≠ x → (var y).Subst x r (var y)
- absShadow {Var : Type u} [DecidableEq Var] {x : Var} {m r : Term Var} : (abs x m).Subst x r (abs x m)
- absIn {Var : Type u} [DecidableEq Var] {x y : Var} {m r m' : Term Var} : y ∉ r.fv ∪ {x} → m.Subst x r m' → (abs y m).Subst x r (abs y m')
- app {Var : Type u} [DecidableEq Var] {m n : Term Var} {x : Var} {r m' n' : Term Var} : m.Subst x r m' → n.Subst x r n' → (m.app n).Subst x r (m'.app n')
- alpha {Var : Type u} [DecidableEq Var] {m m' r r' n n' : Term Var} {x : Var} : m =α m' → r =α r' → n =α n' → m.Subst x r n → m'.Subst x r' n'
Instances For
Capture-avoiding substitution. m.subst x r replaces the free occurrences of variable x
in m with r.
Equations
Instances For
Term.subst is a substitution for λ-terms. Gives access to the notation m[x := n].
Equations
- One or more equations did not get rendered due to their size.
- Cslib.LambdaCalculus.Named.Untyped.Term.instDecidableEqContext.decEq Cslib.LambdaCalculus.Named.Untyped.Term.Context.hole Cslib.LambdaCalculus.Named.Untyped.Term.Context.hole = isTrue ⋯
- Cslib.LambdaCalculus.Named.Untyped.Term.instDecidableEqContext.decEq Cslib.LambdaCalculus.Named.Untyped.Term.Context.hole (Cslib.LambdaCalculus.Named.Untyped.Term.Context.abs x_2 c) = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.Term.instDecidableEqContext.decEq Cslib.LambdaCalculus.Named.Untyped.Term.Context.hole (c.appL m) = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.Term.instDecidableEqContext.decEq Cslib.LambdaCalculus.Named.Untyped.Term.Context.hole (Cslib.LambdaCalculus.Named.Untyped.Term.Context.appR m c) = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.Term.instDecidableEqContext.decEq (Cslib.LambdaCalculus.Named.Untyped.Term.Context.abs x_2 c) Cslib.LambdaCalculus.Named.Untyped.Term.Context.hole = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.Term.instDecidableEqContext.decEq (Cslib.LambdaCalculus.Named.Untyped.Term.Context.abs x_2 c) (c_1.appL m) = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.Term.instDecidableEqContext.decEq (c.appL m) Cslib.LambdaCalculus.Named.Untyped.Term.Context.hole = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.Term.instDecidableEqContext.decEq (c.appL m) (Cslib.LambdaCalculus.Named.Untyped.Term.Context.abs x_2 c_1) = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.Term.instDecidableEqContext.decEq (c.appL m) (Cslib.LambdaCalculus.Named.Untyped.Term.Context.appR m_1 c_1) = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.Term.instDecidableEqContext.decEq (Cslib.LambdaCalculus.Named.Untyped.Term.Context.appR m c) Cslib.LambdaCalculus.Named.Untyped.Term.Context.hole = isFalse ⋯
- Cslib.LambdaCalculus.Named.Untyped.Term.instDecidableEqContext.decEq (Cslib.LambdaCalculus.Named.Untyped.Term.Context.appR m c) (c_1.appL m_1) = isFalse ⋯
Instances For
Replaces the hole in a Context with a Term.
Equations
- Cslib.LambdaCalculus.Named.Untyped.Term.Context.hole.fill m = m
- (Cslib.LambdaCalculus.Named.Untyped.Term.Context.abs x c_2).fill m = Cslib.LambdaCalculus.Named.Untyped.Term.abs x (c_2.fill m)
- (c_2.appL n).fill m = (c_2.fill m).app n
- (Cslib.LambdaCalculus.Named.Untyped.Term.Context.appR n c_2).fill m = n.app (c_2.fill m)
Instances For
Variables (both free and bound) in a context.