Open7

ラムダ計算の基本

りんすりんす

なんとなく読めてしまうがために今まで何となくやり過ごしてきたラムダ計算を、一度きちんと学んでおく

りんすりんす

ラムダ計算の構成要素

ラムダ計算は、次の3つの要素からなる:

  • 変数: x, y, etc.
  • 抽象記号: \lambda.
  • 括弧: (, )
りんすりんす

ラムダ式の定義

ラムダ式の集合 \Lambda は次のように定義される:

  • x が変数なら x \in \Lambda
  • x が変数であって、M \in \Lambda なら \lambda x. M \in \Lambda
  • M \in \Lambda, N \in \Lambda なら (M N) \in \Lambda

\lambda x. M を抽象(abstraction)と呼び、(M N) を適用(application)と呼ぶ

りんすりんす

ラムダ式の文法

ラムダ式の文法には、次のルールがある:

  • 最外側の括弧は、これを無条件に外すことができる
    • (M N) = M N
  • 適用は左結合
    • M N P = ((M N) P)
  • 抽象は右結合
    • \lambda x. \lambda y. M = \lambda x. (\lambda y. M)
  • 適用の結合は、抽象記号のそれよりも優先される
    • \lambda x. M N = \lambda x. (M N)
  • 抽象記号の連続は、略記できる
    • \lambda x. \lambda y. \lambda z. M = \lambda x y z. M
りんすりんす

自由変数と束縛変数

抽象の本体のうち、抽象によって導入される変数を束縛変数(bound variables)という。適用によって抽象の変数(引数)に値を結びつけることを束縛と呼び、同じことだが、値が変数に束縛されるなどという。束縛変数以外の変数を自由変数(free variables)と呼ぶ。

次のラムダ式のうち x は束縛変数であり、 y は自由変数である。

\lambda x. x y

ラムダ式 M の自由変数の集合を \mathrm{FV}(M) のように書き、次のように定義する(ラムダ式の集合 \Lambda の定義を参照):

  • \mathrm{FV}(x) = x
    • ただし x は変数
  • \mathrm{FV}(\lambda x. M) = \mathrm{FV}(M) \backslash x
    • ただし \lambda x. M は抽象
  • \mathrm{FV}(M N) = \mathrm{FV}(M) \cup \mathrm{FV}(N)
    • ただし (M N) は適用

自由変数を持たないラムダ式を閉じている(closed)などという。

ある抽象の自由変数は、より外側の抽象の束縛変数でありうる。ラムダ式 \lambda f. \lambda x. fx を考えるとき、内側の抽象 \lambda x. M から見れば f は自由変数であるが、外側の \lambda f. M から見れば f は束縛変数である。

りんすりんす

簡約

ラムダ式の意味は、どのようにラムダ式を簡約(reduction)できるかによって定義される。簡約には次の3つがある:

  • \alpha 変換 (alpha-conversion)
    • 変数名の変更
    • E.g. \lambda x. f x \rightarrow \lambda y. f y
  • \beta 簡約 (beta-redution)
    • 抽象に変数を適用する
    • E.g. (\lambda x. M x x)N \rightarrow M N N
  • \eta 簡約 (eta-redution)
    • 外延的等価(任意の引数について同じ結果を返す等価関係)
    • E.g. \lambda x. f x \rightarrow f

簡約によって同じ形に変換できることによって定義されるラムダ式の同値関係を、それぞれの名前を冠して次のように呼ぶ:

  • \alpha 同値
  • \beta 同値
  • \eta 同値
りんすりんす

ラムダ式の例

  • 関数 id :: a -> a
    • \lambda x. x
  • 関数 const :: a -> b -> a
    • \lambda xy. x
  • チャーチ数
    • 0: \lambda xy. y
    • 1: \lambda xy. x y
    • 2: \lambda xy. x (x y)
  • ブール値
    • true: \lambda xyz. x y
    • false: \lambda xyz. x z
  • if a then b else c
    • \lambda abc. abc
      • ただし変数 a は上のブール値であることを期待する
      • \eta 簡約すると \lambda a. a となり、 id\eta 同値であることが分かる