SKI Combinatory Logic #
This file defines the syntax and operational semantics (reduction rules) of combinatory logic, using the SKI basis.
Main definitions #
SKI: the type of expressions in the SKI calculus,Red: single-step reduction of SKI expressions,MRed: multi-step reduction of SKI expressions,CommonReduct: the relation between terms having a common reduct,
Notation #
⬝: application between SKI terms,⇒: single-step reduction,↠: multi-step reduction,
References #
The setup of SKI combinatory logic is standard, see for example:
Equations
- One or more equations did not get rendered due to their size.
- Cslib.instReprSKI.repr Cslib.SKI.S prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Cslib.SKI.S")).group prec✝
- Cslib.instReprSKI.repr Cslib.SKI.K prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Cslib.SKI.K")).group prec✝
- Cslib.instReprSKI.repr Cslib.SKI.I prec✝ = Repr.addAppParen (Std.Format.nest (if prec✝ ≥ 1024 then 1 else 2) (Std.Format.text "Cslib.SKI.I")).group prec✝
Instances For
Equations
- Cslib.instReprSKI = { reprPrec := Cslib.instReprSKI.repr }
Equations
- One or more equations did not get rendered due to their size.
- Cslib.instDecidableEqSKI.decEq Cslib.SKI.S Cslib.SKI.S = isTrue ⋯
- Cslib.instDecidableEqSKI.decEq Cslib.SKI.S Cslib.SKI.K = isFalse Cslib.instDecidableEqSKI.decEq._proof_1
- Cslib.instDecidableEqSKI.decEq Cslib.SKI.S Cslib.SKI.I = isFalse Cslib.instDecidableEqSKI.decEq._proof_2
- Cslib.instDecidableEqSKI.decEq Cslib.SKI.S (a.app a_1) = isFalse ⋯
- Cslib.instDecidableEqSKI.decEq Cslib.SKI.K Cslib.SKI.S = isFalse Cslib.instDecidableEqSKI.decEq._proof_4
- Cslib.instDecidableEqSKI.decEq Cslib.SKI.K Cslib.SKI.K = isTrue ⋯
- Cslib.instDecidableEqSKI.decEq Cslib.SKI.K Cslib.SKI.I = isFalse Cslib.instDecidableEqSKI.decEq._proof_5
- Cslib.instDecidableEqSKI.decEq Cslib.SKI.K (a.app a_1) = isFalse ⋯
- Cslib.instDecidableEqSKI.decEq Cslib.SKI.I Cslib.SKI.S = isFalse Cslib.instDecidableEqSKI.decEq._proof_7
- Cslib.instDecidableEqSKI.decEq Cslib.SKI.I Cslib.SKI.K = isFalse Cslib.instDecidableEqSKI.decEq._proof_8
- Cslib.instDecidableEqSKI.decEq Cslib.SKI.I Cslib.SKI.I = isTrue ⋯
- Cslib.instDecidableEqSKI.decEq Cslib.SKI.I (a.app a_1) = isFalse ⋯
- Cslib.instDecidableEqSKI.decEq (a.app a_1) Cslib.SKI.S = isFalse ⋯
- Cslib.instDecidableEqSKI.decEq (a.app a_1) Cslib.SKI.K = isFalse ⋯
- Cslib.instDecidableEqSKI.decEq (a.app a_1) Cslib.SKI.I = isFalse ⋯
Instances For
Application $x y ↦ xy$
Equations
- Cslib.SKI.«term_⬝_» = Lean.ParserDescr.trailingNode `Cslib.SKI.«term_⬝_» 100 100 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol " ⬝ ") (Lean.ParserDescr.cat `term 101))
Instances For
The size of an SKI term is its number of combinators.
Equations
- Cslib.SKI.S.size = 1
- Cslib.SKI.K.size = 1
- Cslib.SKI.I.size = 1
- (a.app a_1).size = a.size + a_1.size
Instances For
Reduction relations between SKI terms #
Single-step reduction of SKI terms
- red_S
(x y z : SKI)
: (((S.app x).app y).app z).Red ((x.app z).app (y.app z))
The operational semantics of the
S, - red_K
(x y : SKI)
: ((K.app x).app y).Red x
K, - red_I
(x : SKI)
: (I.app x).Red x
and
Icombinators. - red_head
(x x' y : SKI)
: x.Red x' → (x.app y).Red (x'.app y)
Reduction on the head
- red_tail
(x y y' : SKI)
: y.Red y' → (x.app y).Red (x.app y')
and tail of an SKI term.
Instances For
Equations
- Cslib.SKI.«term_⭢_» = Lean.ParserDescr.trailingNode `Cslib.SKI.«term_⭢_» 1022 39 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol " ⭢ ") (Lean.ParserDescr.cat `term 39))
Instances For
Equations
- Cslib.SKI.«term_↠_» = Lean.ParserDescr.trailingNode `Cslib.SKI.«term_↠_» 1022 39 (Lean.ParserDescr.binary `andthen (Lean.ParserDescr.symbol " ↠ ") (Lean.ParserDescr.cat `term 39))
Instances For
Express that two terms have a reduce to a common term.
Instances For
theorem
Cslib.SKI.commonReduct_head
{x x' : SKI}
(y : SKI)
:
x.CommonReduct x' → (x.app y).CommonReduct (x'.app y)
theorem
Cslib.SKI.commonReduct_tail
(x : SKI)
{y y' : SKI}
:
y.CommonReduct y' → (x.app y).CommonReduct (x.app y')