コンテンツにスキップ

型なしラムダ計算:関数の適用と置換だけで計算を書き尽くす

対象読者: 本テーマの計算可能性の章(チューリング機械・再帰関数)と、数学的帰納法・構造に関する帰納法を学んだ人。ラムダ計算や関数型言語の知識は仮定しません。

前提となる記事:計算可能性:チューリング機械・再帰関数・停止問題とライスの定理、証明の技術:数学的帰納法と背理法はなぜ正しいのか、不変量の原理

生 Markdown

この記事で扱うのは、「xx に x2+1x^2+1 を対応させる関数」に名前を付けずに書き、その関数に値を渡して中身を書き換えていく、というだけの小さな計算の体系です。ところがこの体系だけで、数も条件分岐も繰り返しも表せます。読み終えると、「どの順番で書き換えても答えは一つしかない」ことと、「この体系が通常の意味の計算可能な関数をすべて表せる」ことの理由が分かります。

  • ラムダ計算は「関数を作る」(λx.M\lambda x.M) と「関数を適用する」(MNMN) の二つの操作だけからなる計算の体系です。計算の規則は (λx.M)N→M[x:=N](\lambda x.M)N\to M[x:=N](β 簡約)ただ一つです。
  • チャーチ=ロッサーの定理(定理 4.1):どの順番で簡約しても、結果は最後に合流できる。とくに正規形(それ以上簡約できない形)は、存在すればただ一つです。並行簡約と「完全展開」を使って証明します。
  • 不動点定理(定理 5.1):任意の項 FF に対して FX=βXFX=_\beta X となる XX がある。名前のない関数だけで再帰的定義を書けるのは、この定理のおかげです。
  • 自然数をチャーチ数 n‾=λfx.fnx\overline n=\lambda f x.f^n x で表すと、λ 定義可能な数論的関数はちょうど再帰関数です(定理 6.4)。チューリング機械と同じ計算能力を、関数の言葉だけで実現しています。
  • ラムダ計算は Lisp・Haskell・Lean などの関数型言語の核であり、次章のカリー=ハワード対応で「証明」の計算側の顔になります。

1. 動機:名前のない関数で計算を書く

Section titled “1. 動機:名前のない関数で計算を書く”

1.1. 「関数そのもの」を書きたい

Section titled “1.1. 「関数そのもの」を書きたい”

数学では f(x)=x2+1f(x)=x^2+1 のように、関数を名前 ff と変数 xx を使って定義します。けれども、関数を「値」として扱いたい場面がよくあります。微分作用素 DD は関数を受け取って関数を返しますし、積分 ∫01(⋅) dx\int_0^1(\cdot)\,dx は関数を受け取って数を返します。このとき「xx に x2+1x^2+1 を対応させる関数」を名前なしで書けると便利です。それが λx. x2+1\lambda x.\,x^2+1 という記法で、プログラミング言語では fun x => x^2 + 1(Lean)や lambda x: x**2 + 1(Python)と書きます。

チャーチ (1930 年代) は、この「名前のない関数」と「適用」だけで数学の基礎を作ろうとしました。論理体系としての試みは矛盾で挫折しましたが、残った計算の部分が驚くほど強力でした。数も、真偽値も、組も、再帰も、すべて関数で表せるのです。

ラムダ計算には、三つの顔があります。

  1. 計算のモデル。計算可能性 のチューリング機械と再帰関数に並ぶ、三つ目の定義です。三者が一致することが、チャーチ=チューリングの提唱(注意 6.4[計算可能性])の根拠の一つになりました。この記事で、再帰関数との一致を証明します。
  2. プログラミング言語の核。関数型言語の評価は β 簡約そのものです。どの順に評価しても答えが同じになる、という安心感の数学的な根拠がチャーチ=ロッサーの定理です。
  3. 証明の計算的な中身。次章で型を付けると、λ 項がそのまま自然演繹の証明になり、β 簡約が「証明の回り道を取り除く」操作になります(カリー=ハワード対応)。Lean で theorem の証明として書く項は、型付きの λ 項です。

この記事は型を付けない体系を扱います。型がないので xxxx(自分自身への適用)も許され、そこから不動点と無限ループが生まれます。この自由さが計算の万能性の源であり、同時に論理としての矛盾の源でもあります。

定義 2.1(λ 項)↗

可算無限個の変数 x,y,z,…x,y,z,\ldots を用意する。λ 項を次で帰納的に定める。

  1. 変数 xx は λ 項である。
  2. M,NM,N が λ 項ならば、適用 (MN)(MN) は λ 項である。
  3. MM が λ 項で xx が変数ならば、抽象 (λx.M)(\lambda x.M) は λ 項である。

括弧は省略し、適用は左結合(MNL=(MN)LMNL=(MN)L)、λ\lambda の作用域はできるだけ右へ伸ばし、λxy.M=λx.λy.M\lambda xy.M=\lambda x.\lambda y.M と書く。自由変数の集合 FV\mathrm{FV} を FV(x)={x}\mathrm{FV}(x)=\{x\}、FV(MN)=FV(M)∪FV(N)\mathrm{FV}(MN)=\mathrm{FV}(M)\cup\mathrm{FV}(N)、FV(λx.M)=FV(M)∖{x}\mathrm{FV}(\lambda x.M)=\mathrm{FV}(M)\setminus\{x\} で定める。自由変数をもたない項を閉項という。

λx.x\lambda x.x と λy.y\lambda y.y はどちらも恒等関数で、束縛変数の名前だけが違います。束縛変数の付け替えで移り合う項を α 同値(同値関係の一つ)といい、以下では α 同値な項を同一視し、等号 ≡\equiv で表します。さらに、ある議論に現れる束縛変数は、自由変数とも互いにも異なるように選んであるものとします(変数の規約)。

定義 2.2(置換)↗

M[x:=N]M[x:=N] を、MM の自由な xx をすべて NN で置き換えた項とする。帰納的には

x[x:=N]≡N,y[x:=N]≡y (y≠x),(PQ)[x:=N]≡P[x:=N] Q[x:=N],x[x:=N]\equiv N,\quad y[x:=N]\equiv y\ (y\ne x),\quad (PQ)[x:=N]\equiv P[x:=N]\,Q[x:=N],(λy.P)[x:=N]≡λy.P[x:=N](y≠x, y∉FV(N))(\lambda y.P)[x:=N]\equiv\lambda y.P[x:=N]\quad(y\ne x,\ y\notin\mathrm{FV}(N))

と定める。最後の条件は変数の規約により(束縛変数を付け替えて)いつでも満たせる。

なお、条件を満たすように束縛変数を付け替える手順は単純で、λy.P\lambda y.P の yy を NN の自由変数ではない新しい変数 y′y' に取り替え、PP の中の自由な yy も同じ y′y' に取り替えるだけです。たとえば (λy.x)[x:=y](\lambda y.x)[x:=y] なら、先に λy.x\lambda y.x を λy′.x\lambda y'.x と書き直してから置換して λy′.y\lambda y'.y とします。

条件 y∉FV(N)y\notin\mathrm{FV}(N) を落とすと、(λy.x)[x:=y](\lambda y.x)[x:=y] が λy.y\lambda y.y になってしまいます。「定数関数 yy」のはずが恒等関数に化けるわけで、これを変数の捕獲といいます。

補題 2.3(置換補題)✓

x≠yx\ne y かつ x∉FV(L)x\notin\mathrm{FV}(L) ならば、

M[x:=N][y:=L]≡M[y:=L][x:=N[y:=L]].M[x:=N][y:=L]\equiv M[y:=L][x:=N[y:=L]].
証明(補題 2.3)

MM の構成に関する帰納法。M≡xM\equiv x なら両辺とも N[y:=L]N[y:=L]。M≡yM\equiv y なら左辺は y[y:=L]≡Ly[y:=L]\equiv L(xx の置換は yy を変えない)、右辺は L[x:=N[y:=L]]≡LL[x:=N[y:=L]]\equiv L(x∉FV(L)x\notin\mathrm{FV}(L))。MM がそれ以外の変数 zz なら両辺とも zz。M≡PQM\equiv PQ なら帰納法の仮定を各成分に使う。M≡λz.PM\equiv\lambda z.P なら、変数の規約で z≠x,yz\ne x,y、z∉FV(N)∪FV(L)z\notin\mathrm{FV}(N)\cup\mathrm{FV}(L) としてよく、置換は λz\lambda z の内側に入るので PP についての帰納法の仮定に帰着する。

定義 3.1(β 簡約)↗

(λx.M)N(\lambda x.M)N の形の項を β 基(redex)といい、M[x:=N]M[x:=N] をその縮約という。項の中の一つの β 基を縮約することを 1 ステップの β 簡約 M→βNM\to_\beta N という。厳密には、(λx.M)N→βM[x:=N](\lambda x.M)N\to_\beta M[x:=N] を含み、M→βM′M\to_\beta M' ならば MN→βM′NMN\to_\beta M'N、NM→βNM′NM\to_\beta NM'、λx.M→βλx.M′\lambda x.M\to_\beta\lambda x.M' となる最小の関係である。

→β\to_\beta の反射推移閉包を ↠β\twoheadrightarrow_\beta(簡約)、反射対称推移閉包を =β=_\beta(β 同値)と書く。β 基を含まない項を β 正規形といい、M↠βNM\twoheadrightarrow_\beta N で NN が正規形のとき、NN を MM の正規形という。

例 3.2(簡約のいろいろな振る舞い)

I≡λx.xI\equiv\lambda x.x、K≡λxy.xK\equiv\lambda xy.x、ω≡λx.xx\omega\equiv\lambda x.xx、Ω≡ωω\Omega\equiv\omega\omega とおきます。

  • IM→βMIM\to_\beta M。KMN→β(λy.M)N→βMKMN\to_\beta(\lambda y.M)N\to_\beta M(y∉FV(M)y\notin\mathrm{FV}(M))。
  • Ω≡(λx.xx)(λx.xx)→β(λx.xx)(λx.xx)≡Ω\Omega\equiv(\lambda x.xx)(\lambda x.xx)\to_\beta(\lambda x.xx)(\lambda x.xx)\equiv\Omega。Ω\Omega は自分自身にしか簡約されず、正規形をもちません。
  • KIΩKI\Omega は、先頭の KK から簡約すれば 2 ステップで II になります。一方、引数の Ω\Omega ばかり簡約し続けると、いつまでも終わりません。

最後の例は、簡約の順序によって止まったり止まらなかったりすることを示しています。それでも、止まったときの答えは一つしかない、というのが次節の定理です。

定理 4.1(チャーチ=ロッサーの定理)✓

M↠βN1M\twoheadrightarrow_\beta N_1 かつ M↠βN2M\twoheadrightarrow_\beta N_2 ならば、N1↠βPN_1\twoheadrightarrow_\beta P かつ N2↠βPN_2\twoheadrightarrow_\beta P となる項 PP が存在する。

1 ステップの →β\to_\beta について「合流」を示して繰り返す、という素朴な方針はうまくいきません。(λx.xx)((λy.y)z)(\lambda x.xx)((\lambda y.y)z) で引数のほうを先に縮約すると、もう一方の道では引数が 2 か所にコピーされているので、追いつくのに 2 ステップ必要になるからです。そこで、複数の β 基を同時に縮約する関係を考えます(テイトとマーティン=レーフの方法、高橋の完全展開による簡略化)。

定義 4.2(並行簡約と完全展開)↗

並行簡約 ⇒\Rightarrow を次の規則で帰納的に定める。

  1. x⇒xx\Rightarrow x。
  2. M⇒M′M\Rightarrow M' ならば λx.M⇒λx.M′\lambda x.M\Rightarrow\lambda x.M'。
  3. M⇒M′M\Rightarrow M'、N⇒N′N\Rightarrow N' ならば MN⇒M′N′MN\Rightarrow M'N'。
  4. M⇒M′M\Rightarrow M'、N⇒N′N\Rightarrow N' ならば (λx.M)N⇒M′[x:=N′](\lambda x.M)N\Rightarrow M'[x:=N']。

項 MM の完全展開 M∗M^{*} を、x∗≡xx^{*}\equiv x、(λx.M)∗≡λx.M∗(\lambda x.M)^{*}\equiv\lambda x.M^{*}、((λx.M)N)∗≡M∗[x:=N∗]((\lambda x.M)N)^{*}\equiv M^{*}[x:=N^{*}]、MM が抽象でないとき (MN)∗≡M∗N∗(MN)^{*}\equiv M^{*}N^{*} で定める。

M∗M^{*} は「MM に最初からある β 基を、内側から全部いっぺんに縮約したもの」です。たとえば M≡(λx.xx)(Iz)M\equiv(\lambda x.xx)(Iz)(I≡λy.yI\equiv\lambda y.y)では、引数 IzIz の完全展開は zz、本体 xxxx の完全展開は xxxx 自身なので、M∗≡(xx)[x:=z]≡zzM^{*}\equiv(xx)[x:=z]\equiv zz です。外側の β 基と引数の β 基が一度に縮約されています。

並行簡約を考える狙いは、次の三角補題にあります。どの並行簡約の行き先 NN からも、完全展開 M∗M^{*} という一つの決まった項に 1 歩で追いつける、という主張です。これが菱形性そのものになり、チャーチ=ロッサーの定理が出ます。

補題 4.3(並行簡約の基本性質)✓

(1) すべての MM で M⇒MM\Rightarrow M。(2) M→βNM\to_\beta N ならば M⇒NM\Rightarrow N。(3) M⇒NM\Rightarrow N ならば M↠βNM\twoheadrightarrow_\beta N。したがって ↠β\twoheadrightarrow_\beta は ⇒\Rightarrow の推移閉包に等しい。

証明(補題 4.3)

(1) MM の構成に関する帰納法で、規則 1〜3 を使う。(2) →β\to_\beta の定義に関する帰納法。β 基の縮約 (λx.M)N→βM[x:=N](\lambda x.M)N\to_\beta M[x:=N] は規則 4 と (1)。文脈の中での縮約は、縮約しない部分に (1) を使って規則 2・3 で組み立てる。(3) ⇒\Rightarrow の導出に関する帰納法。規則 4 なら、帰納法の仮定 M↠βM′M\twoheadrightarrow_\beta M'、N↠βN′N\twoheadrightarrow_\beta N' から (λx.M)N↠β(λx.M′)N′→βM′[x:=N′](\lambda x.M)N\twoheadrightarrow_\beta(\lambda x.M')N'\to_\beta M'[x:=N']。ほかの規則も同様。最後の主張は (2) と (3) から従う。

補題 4.4(並行簡約と置換)✓

M⇒M′M\Rightarrow M' かつ N⇒N′N\Rightarrow N' ならば、M[x:=N]⇒M′[x:=N′]M[x:=N]\Rightarrow M'[x:=N']。

証明(補題 4.4)

M⇒M′M\Rightarrow M' の導出に関する帰納法。

  • 規則 1:M≡M′≡yM\equiv M'\equiv y。y≡xy\equiv x なら両辺は N⇒N′N\Rightarrow N'。y≠xy\ne x なら y⇒yy\Rightarrow y。
  • 規則 2・3:帰納法の仮定をそのまま規則 2・3 に入れる(規則 2 では変数の規約で束縛変数を xx と FV(N)\mathrm{FV}(N) から避ける)。
  • 規則 4:M≡(λy.P)QM\equiv(\lambda y.P)Q、M′≡P′[y:=Q′]M'\equiv P'[y:=Q']、P⇒P′P\Rightarrow P'、Q⇒Q′Q\Rightarrow Q'。変数の規約で y≠xy\ne x、y∉FV(N)∪FV(N′)y\notin\mathrm{FV}(N)\cup\mathrm{FV}(N') とする。帰納法の仮定から P[x:=N]⇒P′[x:=N′]P[x:=N]\Rightarrow P'[x:=N']、Q[x:=N]⇒Q′[x:=N′]Q[x:=N]\Rightarrow Q'[x:=N'] なので、規則 4 により
M[x:=N]≡(λy.P[x:=N])(Q[x:=N])⇒P′[x:=N′][y:=Q′[x:=N′]]≡P′[y:=Q′][x:=N′].M[x:=N]\equiv(\lambda y.P[x:=N])(Q[x:=N])\Rightarrow P'[x:=N'][y:=Q'[x:=N']]\equiv P'[y:=Q'][x:=N'].

最後の ≡\equiv は置換補題(補題 2.3。y∉FV(N′)y\notin\mathrm{FV}(N') を使う)である。右辺は M′[x:=N′]M'[x:=N'] に等しい。

補題 4.5(三角補題)✓

M⇒NM\Rightarrow N ならば N⇒M∗N\Rightarrow M^{*}。

証明(補題 4.5)

M⇒NM\Rightarrow N の導出に関する帰納法。

  • 規則 1:x⇒x≡x∗x\Rightarrow x\equiv x^{*}。
  • 規則 2:λx.P⇒λx.P′\lambda x.P\Rightarrow\lambda x.P'。帰納法の仮定 P′⇒P∗P'\Rightarrow P^{*} と規則 2 で λx.P′⇒λx.P∗≡(λx.P)∗\lambda x.P'\Rightarrow\lambda x.P^{*}\equiv(\lambda x.P)^{*}。
  • 規則 3:PQ⇒P′Q′PQ\Rightarrow P'Q'。PP が抽象でなければ、帰納法の仮定と規則 3 で P′Q′⇒P∗Q∗≡(PQ)∗P'Q'\Rightarrow P^{*}Q^{*}\equiv(PQ)^{*}。P≡λx.RP\equiv\lambda x.R なら、P⇒P′P\Rightarrow P' は規則 2 によるしかないので P′≡λx.R′P'\equiv\lambda x.R'、R⇒R′R\Rightarrow R' である。帰納法の仮定(R⇒R′R\Rightarrow R' と Q⇒Q′Q\Rightarrow Q' に対して)R′⇒R∗R'\Rightarrow R^{*}、Q′⇒Q∗Q'\Rightarrow Q^{*} と規則 4 により (λx.R′)Q′⇒R∗[x:=Q∗]≡(PQ)∗(\lambda x.R')Q'\Rightarrow R^{*}[x:=Q^{*}]\equiv(PQ)^{*}。
  • 規則 4:(λx.P)Q⇒P′[x:=Q′](\lambda x.P)Q\Rightarrow P'[x:=Q']。帰納法の仮定 P′⇒P∗P'\Rightarrow P^{*}、Q′⇒Q∗Q'\Rightarrow Q^{*} と 補題 4.4 により P′[x:=Q′]⇒P∗[x:=Q∗]≡((λx.P)Q)∗P'[x:=Q']\Rightarrow P^{*}[x:=Q^{*}]\equiv((\lambda x.P)Q)^{*}。
証明(定理 4.1)

補題 4.5 より、M⇒N1M\Rightarrow N_1 かつ M⇒N2M\Rightarrow N_2 ならば N1⇒M∗N_1\Rightarrow M^{*} かつ N2⇒M∗N_2\Rightarrow M^{*}。つまり ⇒\Rightarrow は菱形性(一歩ずつ分かれた二つの道が、それぞれ一歩で合流する)をもつ。

補題 4.3 より、M↠βN1M\twoheadrightarrow_\beta N_1 は ⇒\Rightarrow の有限列 M≡A0⇒A1⇒⋯⇒Am≡N1M\equiv A_0\Rightarrow A_1\Rightarrow\cdots\Rightarrow A_m\equiv N_1、M↠βN2M\twoheadrightarrow_\beta N_2 は M≡B0⇒⋯⇒Bn≡N2M\equiv B_0\Rightarrow\cdots\Rightarrow B_n\equiv N_2 と書ける。格子 Ci,jC_{i,j}(Ci,0=AiC_{i,0}=A_i、C0,j=BjC_{0,j}=B_j)を、菱形性で Ci+1,j⇒Ci+1,j+1C_{i+1,j}\Rightarrow C_{i+1,j+1} かつ Ci,j+1⇒Ci+1,j+1C_{i,j+1}\Rightarrow C_{i+1,j+1} となるように i+ji+j の小さい順に埋めていく。P=Cm,nP=C_{m,n} とすれば N1⇒⋯⇒PN_1\Rightarrow\cdots\Rightarrow P、N2⇒⋯⇒PN_2\Rightarrow\cdots\Rightarrow P であり、補題 4.3 (3) により N1↠βPN_1\twoheadrightarrow_\beta P、N2↠βPN_2\twoheadrightarrow_\beta P。

MN₁N₂M*⇒ の菱形MN₁N₂P破線は菱形で補う
チャーチ=ロッサーの証明の構造。並行簡約の菱形(左)をタイルのように敷き詰めて、任意の長さの簡約を合流させる(右)。

系 4.6(チャーチ=ロッサーの帰結)✓

(1) M=βNM=_\beta N であることと、M↠βPM\twoheadrightarrow_\beta P かつ N↠βPN\twoheadrightarrow_\beta P となる PP が存在することは同値である。

(2) 正規形は、存在すればただ一つである。さらに M=βNM=_\beta N で NN が正規形なら M↠βNM\twoheadrightarrow_\beta N。

(3) λxy.x≠βλxy.y\lambda xy.x\ne_\beta\lambda xy.y。とくに =β=_\beta はすべての項を等しくするような自明な関係ではない。

証明(系 4.6)

(1) 共通の簡約先が存在すれば、途中を逆にたどって M=βNM=_\beta N。逆に、「共通の簡約先をもつ」という関係 ∼\sim は反射的・対称的で →β\to_\beta を含む。推移的でもある:M∼NM\sim N(共通の簡約先 PP)、N∼LN\sim L(共通の簡約先 QQ)なら、N↠βPN\twoheadrightarrow_\beta P、N↠βQN\twoheadrightarrow_\beta Q に 定理 4.1 を使って P,Q↠βRP,Q\twoheadrightarrow_\beta R をとると、M,L↠βRM,L\twoheadrightarrow_\beta R。=β=_\beta は →β\to_\beta を含む最小の同値関係なので =β⊆∼=_\beta\subseteq\sim。

(2) N1,N2N_1,N_2 がともに MM の正規形なら、(1) より共通の簡約先 PP がある。正規形は自分自身にしか簡約されないので N1≡P≡N2N_1\equiv P\equiv N_2。後半も (1) から同様。

(3) 両者は異なる正規形なので、(2) より β 同値でない。

(3) は地味ですが重要です。β 同値を「等式」とみなす体系(λ 理論)が無矛盾であることを、この定理が保証しています。

注意 4.7(正規形の見つけ方)

例 3.2 の KIΩKI\Omega のように、正規形があっても簡約の順序しだいで止まらないことがあります。最左最外の β 基(最も左にある λ\lambda から始まる β 基)を常に縮約する戦略をとると、正規形があれば必ずそこに到達することが知られています(正規化定理。Barendregt の教科書の第 13 章)。この記事では使わないので、証明は省略します。

型のない世界では、すべての項に不動点があります。

定理 5.1(不動点定理)✓

Y≡λf.(λx.f(xx))(λx.f(xx))Y\equiv\lambda f.(\lambda x.f(xx))(\lambda x.f(xx)) とおく。任意の項 FF について YF=βF(YF)YF=_\beta F(YF)。とくに任意の FF に対して FX=βXFX=_\beta X となる XX が存在する。

証明(定理 5.1)

A≡λx.F(xx)A\equiv\lambda x.F(xx) とおくと、YF→βAA→βF(AA)YF\to_\beta AA\to_\beta F(AA)。一方 F(YF)→βF(AA)F(YF)\to_\beta F(AA)。両者は共通の簡約先 F(AA)F(AA) をもつので YF=βF(YF)YF=_\beta F(YF)。X≡YFX\equiv YF とすればよい。

YFYF は F(YF)F(YF) に簡約されるわけではなく、両者が共通の項に簡約されるだけです。「2+32+3 と 1+41+4 は、どちらも計算すれば 55 になるので等しい」というのと同じ感覚で、=β=_\beta は「簡約の向きは問わず、どこかで合流する」という関係です。簡約の向きまで欲しいときは、チューリングの不動点結合子 Θ≡(λxy.y(xxy))(λxy.y(xxy))\Theta\equiv(\lambda xy.y(xxy))(\lambda xy.y(xxy)) を使います。ΘF↠βF(ΘF)\Theta F\twoheadrightarrow_\beta F(\Theta F) は 2 ステップで確かめられます(演習)。

不動点定理は、再帰的定義を名前なしで書く方法を与えます。「f=⋯f⋯f=\cdots f\cdots」と自分自身を参照して定義したい関数があれば、右辺の ff を変数として抽象した F≡λf.⋯f⋯F\equiv\lambda f.\cdots f\cdots をつくり、YFYF をとればよいのです。定理 6.4 の証明で、最小化をこの方法で実現します。

6.1. チャーチ数と基本的な符号化

Section titled “6.1. チャーチ数と基本的な符号化”

この節では 計算可能性 に合わせて 00 も自然数に含め、N={0,1,2,…}\mathbb{N}=\{0,1,2,\ldots\} とします。

定義 6.1(チャーチ数と λ 定義可能性)↗

n∈Nn\in\mathbb{N} のチャーチ数を n‾≡λfx.fnx\overline n\equiv\lambda fx.f^nx とする。ここで f0x≡xf^0x\equiv x、fn+1x≡f(fnx)f^{n+1}x\equiv f(f^nx)。全関数 φ:Nk→N\varphi:\mathbb{N}^k\to\mathbb{N} が λ 定義可能であるとは、閉項 FF が存在して、すべての n1,…,nkn_1,\ldots,n_k について

F n1‾⋯nk‾=βφ(n1,…,nk)‾F\,\overline{n_1}\cdots\overline{n_k}=_\beta\overline{\varphi(n_1,\ldots,n_k)}

となることをいう。

チャーチ数 n‾\overline n は「関数を nn 回繰り返す」という操作そのものです。すぐに確かめられる性質として、任意の F,XF,X について n‾FX↠βFnX\overline nFX\twoheadrightarrow_\beta F^nX。そこから n+1‾FX=βF(n‾FX)\overline{n+1}FX=_\beta F(\overline nFX) が従います(両辺とも Fn+1XF^{n+1}X に簡約される)。

補題 6.2(チャーチ数・真偽値・組の基本項)✓

(1) S≡λnfx.f(nfx)\mathsf{S}\equiv\lambda nfx.f(nfx) について S n‾↠βn+1‾\mathsf{S}\,\overline n\twoheadrightarrow_\beta\overline{n+1}。(2) T≡λxy.x\mathsf{T}\equiv\lambda xy.x、F≡λxy.y\mathsf{F}\equiv\lambda xy.y について TMN↠βM\mathsf{T}MN\twoheadrightarrow_\beta M、FMN↠βN\mathsf{F}MN\twoheadrightarrow_\beta N。(3) Z≡λn.n(λz.F)T\mathsf{Z}\equiv\lambda n.n(\lambda z.\mathsf{F})\mathsf{T} について Z 0‾↠βT\mathsf{Z}\,\overline0\twoheadrightarrow_\beta\mathsf{T}、Z n+1‾↠βF\mathsf{Z}\,\overline{n+1}\twoheadrightarrow_\beta\mathsf{F}。(4) ⟨M,N⟩≡λz.zMN\langle M,N\rangle\equiv\lambda z.zMN、π1≡λp.pT\pi_1\equiv\lambda p.p\mathsf{T}、π2≡λp.pF\pi_2\equiv\lambda p.p\mathsf{F} について πi⟨M1,M2⟩↠βMi\pi_i\langle M_1,M_2\rangle\twoheadrightarrow_\beta M_i。

証明(補題 6.2)

(1) S n‾↠βλfx.f(n‾fx)↠βλfx.f(fnx)≡n+1‾\mathsf{S}\,\overline n\twoheadrightarrow_\beta\lambda fx.f(\overline nfx)\twoheadrightarrow_\beta\lambda fx.f(f^nx)\equiv\overline{n+1}(n‾fx↠βfnx\overline nfx\twoheadrightarrow_\beta f^nx)。(2) TMN→β(λy.M)N→βM\mathsf{T}MN\to_\beta(\lambda y.M)N\to_\beta M、FMN→β(λy.y)N→βN\mathsf{F}MN\to_\beta(\lambda y.y)N\to_\beta N。(3) Z 0‾→β0‾(λz.F)T↠βT\mathsf{Z}\,\overline0\to_\beta\overline0(\lambda z.\mathsf{F})\mathsf{T}\twoheadrightarrow_\beta\mathsf{T}、Z n+1‾↠β(λz.F)((λz.F)nT)→βF\mathsf{Z}\,\overline{n+1}\twoheadrightarrow_\beta(\lambda z.\mathsf{F})((\lambda z.\mathsf{F})^n\mathsf{T})\to_\beta\mathsf{F}。(4) πi⟨M1,M2⟩→β⟨M1,M2⟩T\pi_i\langle M_1,M_2\rangle\to_\beta\langle M_1,M_2\rangle\mathsf{T}(または F\mathsf{F})→βTM1M2↠βM1\to_\beta\mathsf{T}M_1M_2\twoheadrightarrow_\beta M_1(i=2i=2 なら FM1M2↠βM2\mathsf{F}M_1M_2\twoheadrightarrow_\beta M_2)。

例 6.3(チャーチ数の演算)

  • 後者 S≡λnfx.f(nfx)\mathsf{S}\equiv\lambda nfx.f(nfx):S n‾↠βλfx.f(n‾fx)↠βλfx.f(fnx)≡n+1‾\mathsf{S}\,\overline n\twoheadrightarrow_\beta\lambda fx.f(\overline nfx)\twoheadrightarrow_\beta\lambda fx.f(f^nx)\equiv\overline{n+1}。
  • 真偽値 T≡λxy.x\mathsf{T}\equiv\lambda xy.x、F≡λxy.y\mathsf{F}\equiv\lambda xy.y。TMN↠βM\mathsf{T}MN\twoheadrightarrow_\beta M、FMN↠βN\mathsf{F}MN\twoheadrightarrow_\beta N なので、BMNBMN が「if BB then MM else NN」になる。
  • ゼロ判定 Z≡λn.n(λz.F)T\mathsf{Z}\equiv\lambda n.n(\lambda z.\mathsf{F})\mathsf{T}:Z 0‾↠βT\mathsf{Z}\,\overline0\twoheadrightarrow_\beta\mathsf{T}、Z n+1‾↠β(λz.F)(⋯ )→βF\mathsf{Z}\,\overline{n+1}\twoheadrightarrow_\beta(\lambda z.\mathsf{F})(\cdots)\to_\beta\mathsf{F}。
  • 組 ⟨M,N⟩≡λz.zMN\langle M,N\rangle\equiv\lambda z.zMN、射影 π1≡λp.pT\pi_1\equiv\lambda p.p\mathsf{T}、π2≡λp.pF\pi_2\equiv\lambda p.p\mathsf{F}:πi⟨M1,M2⟩↠βMi\pi_i\langle M_1,M_2\rangle\twoheadrightarrow_\beta M_i。

型付きの言語でも、型を固定すればチャーチ数を書けます。次の Lean 4 のコード(標準ライブラリだけで動きます)は、2‾\overline2 と 3‾\overline3 の和を計算し、#reduce で正規形を表示させたものです。

def two : (Nat → Nat) → Nat → Nat := fun f x => f (f x)
def three : (Nat → Nat) → Nat → Nat := fun f x => f (f (f x))
def add (m n : (Nat → Nat) → Nat → Nat) : (Nat → Nat) → Nat → Nat :=
fun f x => m f (n f x)
#eval add two three (· + 1) 0 -- 5
#reduce add two three -- fun f x => f (f (f (f (f x))))
example : add two three (· + 1) 0 = 5 := rfl

fun f x => ... が λfx.⋯\lambda fx.\cdots です。#reduce は項を β 簡約(と定義の展開)で正規形にして表示するコマンドで、出力はチャーチ数 5‾\overline5 そのものになっています。ただし Lean では λx.xx\lambda x.xx や YY は型が付かないので書けません。その理由は次章で明らかになります。

定理 6.4(クリーネの定理(λ 定義可能性と再帰性))✓

全関数 φ:Nk→N\varphi:\mathbb{N}^k\to\mathbb{N} について、φ\varphi が再帰関数(定義 4.1[計算可能性] の意味で、全関数である部分再帰関数)であることと、λ 定義可能であることは同値である。

証明の方向は二つあります。再帰関数から λ 項を作る向きでは、再帰関数の生成規則(合成・原始再帰・最小化)を一つずつ λ 項で実現します。逆向きでは、λ 項の簡約の列を数で表して、簡約を追うことが再帰関数で書けることを示します。

まず、再帰関数の作り方を「全関数のまま」で言い直しておきます。

補題 6.5(再帰関数の全関数による生成)✓

再帰関数全体は、基本関数(ゼロ・後者・射影)を含み、合成、原始再帰、および正則な最小化(全関数 gg で、各 x⃗\vec x に g(x⃗,y)=0g(\vec x,y)=0 となる yy が存在するものへの μ\mu)で閉じた最小の関数族に等しい。

証明(補題 6.5)

この族の元は明らかに全関数である部分再帰関数である。逆に φ\varphi を再帰関数とすると、チューリング機械で計算でき(定理 6.2[計算可能性])、クリーネの標準形定理(定理 5.3[計算可能性])により

φ(x⃗)=U(Conf(e,x⃗, μt [Tk(e,x⃗,t)]))\varphi(\vec x)=U\bigl(\mathrm{Conf}(e,\vec x,\ \mu t\,[T_k(e,\vec x,t)])\bigr)

と書ける。Tk,U,ConfT_k,U,\mathrm{Conf} は原始再帰的で、φ\varphi が全関数だから各 x⃗\vec x について Tk(e,x⃗,t)T_k(e,\vec x,t) となる tt が存在する。したがって μ\mu は TkT_k の否定の特性関数 1−˙χTk1\dot-\chi_{T_k} への正則な最小化であり、φ\varphi はこの族に属する。

次の証明の見どころは最小化です。「y=0,1,2,…y=0,1,2,\ldots と順に g(n⃗,y)=0g(\vec n,y)=0 を試し、最初に成り立った yy を返す」という繰り返しを、不動点(§5)を使って W k‾=W\,\overline k=「g(n⃗,k)=0g(\vec n,k)=0 なら k‾\overline k、そうでなければ W k+1‾W\,\overline{k+1}」という形の項で書きます。長い項 Wx⃗W_{\vec x} は、この if 文(Z\mathsf{Z} と T,F\mathsf{T},\mathsf{F})に、自分を呼び直す ww を λw\lambda w で受け取らせたものにすぎません。

証明(定理 6.4)

(再帰的 ⇒ λ 定義可能) 補題 6.5 の生成規則ごとに、λ 定義可能な関数の族が閉じていることを示す。以下 x⃗\vec x は変数の列 x1⋯xkx_1\cdots x_k、n‾⃗\vec{\overline n} は数の列 n1‾⋯nk‾\overline{n_1}\cdots\overline{n_k} を表す。

  • 基本関数:ゼロは λx.0‾\lambda x.\overline0、後者は S\mathsf{S}(補題 6.2)、射影 PikP^k_i は λx⃗.xi\lambda\vec x.x_i。
  • 合成:G,H1,…,HmG,H_1,\ldots,H_m が g,h1,…,hmg,h_1,\ldots,h_m を定義するなら、F≡λx⃗.G(H1x⃗)⋯(Hmx⃗)F\equiv\lambda\vec x.G(H_1\vec x)\cdots(H_m\vec x) について Fn‾⃗↠βG(H1n‾⃗)⋯(Hmn‾⃗)=βG h1(n⃗)‾⋯hm(n⃗)‾=βg(h⃗(n⃗))‾F\vec{\overline n}\twoheadrightarrow_\beta G(H_1\vec{\overline n})\cdots(H_m\vec{\overline n})=_\beta G\,\overline{h_1(\vec n)}\cdots\overline{h_m(\vec n)}=_\beta\overline{g(\vec h(\vec n))}。=β=_\beta が項の部分の置き換えと両立することを使っている。
  • 原始再帰:f(n⃗,0)=g(n⃗)f(\vec n,0)=g(\vec n)、f(n⃗,y+1)=h(n⃗,y,f(n⃗,y))f(\vec n,y+1)=h(\vec n,y,f(\vec n,y)) で、G,HG,H が g,hg,h を定義するとする。Tx⃗≡λp.⟨S(π1p), Hx⃗(π1p)(π2p)⟩T_{\vec x}\equiv\lambda p.\langle\mathsf{S}(\pi_1p),\,H\vec x(\pi_1p)(\pi_2p)\rangle とおき、x⃗\vec x に n‾⃗\vec{\overline n} を代入したものを TT と書く。yy に関する帰納法で y‾T⟨0‾,Gn‾⃗⟩=β⟨y‾,f(n⃗,y)‾⟩\overline yT\langle\overline0,G\vec{\overline n}\rangle=_\beta\langle\overline y,\overline{f(\vec n,y)}\rangle を示す。y=0y=0 は 0‾TP↠βP\overline0TP\twoheadrightarrow_\beta P と Gn‾⃗=βg(n⃗)‾G\vec{\overline n}=_\beta\overline{g(\vec n)} から。y→y+1y\to y+1 は
y+1‾ TP=βT(y‾TP)=βT⟨y‾,f(n⃗,y)‾⟩=β⟨S y‾, Hn‾⃗ y‾ f(n⃗,y)‾⟩=β⟨y+1‾,f(n⃗,y+1)‾⟩.\overline{y+1}\,TP=_\beta T(\overline yTP)=_\beta T\langle\overline y,\overline{f(\vec n,y)}\rangle=_\beta\langle\mathsf{S}\,\overline y,\ H\vec{\overline n}\,\overline y\,\overline{f(\vec n,y)}\rangle=_\beta\langle\overline{y+1},\overline{f(\vec n,y+1)}\rangle.

よって F≡λx⃗y.π2(yTx⃗⟨0‾,Gx⃗⟩)F\equiv\lambda\vec xy.\pi_2(yT_{\vec x}\langle\overline0,G\vec x\rangle) が ff を定義する。

  • 正則な最小化:f(n⃗)=μy[g(n⃗,y)=0]f(\vec n)=\mu y[g(\vec n,y)=0] で、GG が gg を定義するとする。Wx⃗≡Θ(λwy.Z(Gx⃗y) y (w(Sy)))W_{\vec x}\equiv\Theta\bigl(\lambda wy.\mathsf{Z}(G\vec xy)\,y\,(w(\mathsf{S}y))\bigr) とおき、x⃗:=n‾⃗\vec x:=\vec{\overline n} としたものを WW と書く。ΘW′↠βW′(ΘW′)\Theta W'\twoheadrightarrow_\beta W'(\Theta W')(Θ≡AA\Theta\equiv AA、A≡λxy.y(xxy)A\equiv\lambda xy.y(xxy) なので ΘW′≡AAW′→β(λy.y(AAy))W′→βW′(AAW′)\Theta W'\equiv AAW'\to_\beta(\lambda y.y(AAy))W'\to_\beta W'(AAW'))から
W k‾=βZ(Gn‾⃗ k‾) k‾ (W(S k‾))=βZ g(n⃗,k)‾ k‾ (W k+1‾).W\,\overline k=_\beta\mathsf{Z}(G\vec{\overline n}\,\overline k)\,\overline k\,(W(\mathsf{S}\,\overline k))=_\beta\mathsf{Z}\,\overline{g(\vec n,k)}\,\overline k\,(W\,\overline{k+1}).

g(n⃗,k)=0g(\vec n,k)=0 なら右辺は T k‾ (⋯ )=βk‾\mathsf{T}\,\overline k\,(\cdots)=_\beta\overline k、そうでなければ F k‾ (Wk+1‾)=βWk+1‾\mathsf{F}\,\overline k\,(W\overline{k+1})=_\beta W\overline{k+1}。y0=f(n⃗)y_0=f(\vec n) は g(n⃗,y)=0g(\vec n,y)=0 となる最小の yy なので、W0‾=βW1‾=β⋯=βWy0‾=βy0‾W\overline0=_\beta W\overline1=_\beta\cdots=_\beta W\overline{y_0}=_\beta\overline{y_0}。よって F≡λx⃗.Wx⃗0‾F\equiv\lambda\vec x.W_{\vec x}\overline0 が ff を定義する。

(λ 定義可能 ⇒ 再帰的) λ 項をゲーデル数で符号化する(定義 4.1[ゲーデルの不完全性定理] と同じ素数冪の方法で、変数 viv_i、適用、抽象を符号化する)。次の 3 つが原始再帰的であること(補題 6.6)を使う。(a) Red(a,b)\mathrm{Red}(a,b):「bb は aa から束縛変数の付け替え 1 回か、捕獲の起きない β 基の縮約 1 回で得られる項の符号」(補題 6.6 の 1。その 2 の (i)(ii) により、Red\mathrm{Red} の列は ↠β\twoheadrightarrow_\beta をちょうど表す)。(b) Num(b)\mathrm{Num}(b):「bb はあるチャーチ数(と α 同値な項)の符号」と、そのときの値 val(b)\mathrm{val}(b)(同 3)。(c) n⃗↦⌜Fn‾⃗⌝\vec n\mapsto\ulcorner F\vec{\overline n}\urcorner(同 4)。これらから「ss は ⌜Fn‾⃗⌝\ulcorner F\vec{\overline n}\urcorner から始まり Red\mathrm{Red} でつながり、チャーチ数で終わる列の符号」という述語 R(n⃗,s)R(\vec n,s) も原始再帰的になる(命題 3.2[計算可能性] の有界量化と復号 (s)i(s)_i)。

Fn‾⃗=βφ(n⃗)‾F\vec{\overline n}=_\beta\overline{\varphi(\vec n)} で φ(n⃗)‾\overline{\varphi(\vec n)} は正規形だから、系 4.6 (2) により Fn‾⃗↠βφ(n⃗)‾F\vec{\overline n}\twoheadrightarrow_\beta\overline{\varphi(\vec n)}。したがって 補題 6.6 の 2 (ii) により、各 n⃗\vec n について R(n⃗,s)R(\vec n,s) を満たす ss が存在する。さらに、そのような列が到達するチャーチ数は、同じく 2 (i) により Fn‾⃗F\vec{\overline n} から ↠β\twoheadrightarrow_\beta で到達する正規形なので、正規形の一意性によって φ(n⃗)‾\overline{\varphi(\vec n)} に限る。ゆえに

φ(n⃗)=val(列 μs [R(n⃗,s)] の最後の項)\varphi(\vec n)=\mathrm{val}\bigl(\text{列 }\mu s\,[R(\vec n,s)]\text{ の最後の項}\bigr)

であり、正則な最小化と原始再帰関数の合成なので φ\varphi は再帰関数である。

次の補題は、簡約の列を自然数で表し、「ある列が簡約として正しいか」を原始再帰関数で判定できることを示すものです。計算可能性の章でチューリング機械の 1 ステップを数で表したのと同じ作業を、λ 項について行います。証明の中の累積帰納法は、「小さい符号での値を全部使って次の値を決める」再帰の形を、原始再帰に直すための道具です。細部が多いので、まず補題の主張だけ読み、全体の流れは上の説明で追うのがよいでしょう。

補題 6.6(β 簡約の算術化)✓

変数を v0,v1,…v_0,v_1,\ldots とし、(α 同値で同一視する前の)項に符号を ⌜vi⌝=⟨0,i⟩\ulcorner v_i\urcorner=\langle0,i\rangle、⌜PQ⌝=⟨1,⌜P⌝,⌜Q⌝⟩\ulcorner PQ\urcorner=\langle1,\ulcorner P\urcorner,\ulcorner Q\urcorner\rangle、⌜λvi.P⌝=⟨2,i,⌜P⌝⟩\ulcorner\lambda v_i.P\urcorner=\langle2,i,\ulcorner P\urcorner\rangle で与える(⟨x0,…,xk⟩=∏j≤kpjxj+1\langle x_0,\ldots,x_k\rangle=\prod_{j\le k}p_j^{x_j+1})。Red(a,b)\mathrm{Red}(a,b) を「aa は項の符号で、bb は、aa の項の部分項 1 つを、(α) λvj.P\lambda v_j.P と λvk.P[vj:=vk]\lambda v_k.P[v_j:=v_k](vkv_k は PP に現れない変数)の一方から他方に付け替えるか、(β) β 基 (λvi.M)N(\lambda v_i.M)N で MM のどの λvj\lambda v_j(vj∈FV(N)v_j\in\mathrm{FV}(N))の作用域にも自由な viv_i がないものを、MM の自由な viv_i を NN に置き換えた項に縮約して得られる項の符号」とする。ここで §2 の α 同値(束縛変数の付け替えで移り合うこと)は、(α) の付け替えを部分項に有限回施して移り合うこと、と精密に読む(Barendregt の教科書の定義と同じ)。このとき

  1. Red\mathrm{Red} は原始再帰的である。
  2. (i) 符号 aa から符号 bb まで Red\mathrm{Red} の有限列でつながるならば、aa の表す項は bb の表す項に ↠β\twoheadrightarrow_\beta で簡約される。(ii) M↠βNM\twoheadrightarrow_\beta N ならば、MM の任意の表し方の符号 aa から、NN のある表し方の符号まで Red\mathrm{Red} の有限列でつながる。
  3. Num(b)\mathrm{Num}(b)「bb はあるチャーチ数と α 同値な項の符号」と、そのときの値 val(b)\mathrm{val}(b)(Num(b)\mathrm{Num}(b) でなければ 00)は原始再帰的である。
  4. 閉項 FF を固定すると、n⃗↦⌜Fn‾⃗⌝\vec n\mapsto\ulcorner F\vec{\overline n}\urcorner は原始再帰的である。
証明(補題 6.6)

道具は 命題 3.2[計算可能性] です。符号の第 jj 成分は (w)j−˙1(w)_j\dot-1 で取り出せ、pjx+1>xp_j^{x+1}\gt x なので各成分は元の符号より真に小さい。項の符号であるかどうか、種類(0,1,20,1,2)、成分は、以下の累積帰納法で原始再帰的に判定・計算できます。

累積帰納法。 gg が原始再帰的で f(x⃗,w)=g(x⃗,w,f^(x⃗,w))f(\vec x,w)=g(\vec x,w,\hat f(\vec x,w))、f^(x⃗,w)=∏u<wpuf(x⃗,u)+1\hat f(\vec x,w)=\prod_{u\lt w}p_u^{f(\vec x,u)+1}(ww 未満での値の履歴)と定まる ff は原始再帰的です。実際 f^(x⃗,0)=1\hat f(\vec x,0)=1、f^(x⃗,w+1)=f^(x⃗,w)⋅pwg(x⃗,w,f^(x⃗,w))+1\hat f(\vec x,w+1)=\hat f(\vec x,w)\cdot p_w^{g(\vec x,w,\hat f(\vec x,w))+1} は原始再帰で、f(x⃗,w)=(f^(x⃗,w+1))w−˙1f(\vec x,w)=(\hat f(\vec x,w+1))_w\dot-1 です。u<wu\lt w での値は (f^(x⃗,w))u−˙1(\hat f(\vec x,w))_u\dot-1 として gg の中で使えます。以下の定義はどれも、値を真に小さい符号での値から場合分け(同 2)で決めるので、この形に入ります。パラメータ(i,c,x,yi,c,x,y など)は再帰の間固定です。

基本の関数。 Tm(a)\mathrm{Tm}(a)「aa は項の符号」は、a=⟨0,k⟩a=\langle0,k\rangle であるか、a=⟨1,P,Q⟩a=\langle1,P,Q\rangle で Tm(P)∧Tm(Q)\mathrm{Tm}(P)\wedge\mathrm{Tm}(Q) か、a=⟨2,j,P⟩a=\langle2,j,P\rangle で Tm(P)\mathrm{Tm}(P) であること(k,j,P,Qk,j,P,Q は aa の成分)で、累積帰納法です。Occ(a,k)\mathrm{Occ}(a,k)「vkv_k が aa に(束縛の位置も含めて)現れる」、Fr(a,k)\mathrm{Fr}(a,k)「vkv_k が aa に自由に現れる」は成分についての累積帰納法です(たとえば Fr(⟨2,j,P⟩,k)  ⟺  j≠k∧Fr(P,k)\mathrm{Fr}(\langle2,j,P\rangle,k)\iff j\ne k\wedge\mathrm{Fr}(P,k))。捕獲が起きない条件 FF(a,i,c)\mathrm{FF}(a,i,c) を FF(⟨0,k⟩)\mathrm{FF}(\langle0,k\rangle) は真、FF(⟨1,P,Q⟩)  ⟺  FF(P)∧FF(Q)\mathrm{FF}(\langle1,P,Q\rangle)\iff\mathrm{FF}(P)\wedge\mathrm{FF}(Q)、FF(⟨2,i,P⟩)\mathrm{FF}(\langle2,i,P\rangle) は真、j≠ij\ne i なら FF(⟨2,j,P⟩)  ⟺  (¬Fr(P,i)∨¬Fr(c,j))∧FF(P)\mathrm{FF}(\langle2,j,P\rangle)\iff(\neg\mathrm{Fr}(P,i)\vee\neg\mathrm{Fr}(c,j))\wedge\mathrm{FF}(P) で定めます。付け替えのない置換 sb(a,i,c)\mathrm{sb}(a,i,c) を

sb(⟨0,i⟩)=c,sb(⟨0,k⟩)=⟨0,k⟩ (k≠i),sb(⟨1,P,Q⟩)=⟨1,sb(P),sb(Q)⟩,\mathrm{sb}(\langle0,i\rangle)=c,\quad\mathrm{sb}(\langle0,k\rangle)=\langle0,k\rangle\ (k\ne i),\quad\mathrm{sb}(\langle1,P,Q\rangle)=\langle1,\mathrm{sb}(P),\mathrm{sb}(Q)\rangle,sb(⟨2,i,P⟩)=⟨2,i,P⟩,sb(⟨2,j,P⟩)=⟨2,j,sb(P)⟩ (j≠i)\mathrm{sb}(\langle2,i,P\rangle)=\langle2,i,P\rangle,\quad\mathrm{sb}(\langle2,j,P\rangle)=\langle2,j,\mathrm{sb}(P)\rangle\ (j\ne i)

で定めます。右辺の再帰呼び出しはすべて aa の成分(aa より小さい)なので、累積帰納法で原始再帰的です。

a,ca,c が項 M,NM,N の符号で FF(a,i,c)\mathrm{FF}(a,i,c) ならば、sb(a,i,c)\mathrm{sb}(a,i,c) は 定義 2.2 の M[vi:=N]M[v_i:=N] の表し方の符号です。aa についての帰納法で確かめます。まず、viv_i が aa に自由に現れなければ、sb(a,i,c)=a\mathrm{sb}(a,i,c)=a(aa についての帰納法)かつ M[vi:=N]≡MM[v_i:=N]\equiv M(定義 2.2 の各式に沿った帰納法)です。変数と適用の場合は 定義 2.2 の式どおりです。a=⟨2,j,P⟩a=\langle2,j,P\rangle で j≠ij\ne i かつ vj∉FV(N)v_j\notin\mathrm{FV}(N) なら、定義 2.2 の最後の式がそのまま使え、FF(P,i,c)\mathrm{FF}(P,i,c) なので PP に帰納法の仮定が使えます。残りは j=ij=i の場合と、j≠ij\ne i かつ vj∈FV(N)v_j\in\mathrm{FV}(N) の場合です。前者では viv_i は aa に自由に現れず、後者では FF\mathrm{FF} の定義により viv_i は PP に自由に現れないので、やはり aa に自由に現れません。どちらも最初に述べたことに帰着します。

部分項の置き換え。 Rp(a,b,x,y)\mathrm{Rp}(a,b,x,y)「bb は aa の部分項 xx の 1 か所を yy に置き換えたもの」は、a=x∧b=ya=x\wedge b=y、または a=⟨1,P,Q⟩a=\langle1,P,Q\rangle、b=⟨1,P′,Q′⟩b=\langle1,P',Q'\rangle で(Rp(P,P′,x,y)∧Q′=Q\mathrm{Rp}(P,P',x,y)\wedge Q'=Q)か(P′=P∧Rp(Q,Q′,x,y)P'=P\wedge\mathrm{Rp}(Q,Q',x,y))、または a=⟨2,j,P⟩a=\langle2,j,P\rangle、b=⟨2,j,P′⟩b=\langle2,j,P'\rangle で Rp(P,P′,x,y)\mathrm{Rp}(P,P',x,y)、で定めます。再帰呼び出しでは aa と bb がともに成分に置き換わるので、w=2a3bw=2^a3^b についての累積帰納法(2P3P′<2a3b2^P3^{P'}\lt2^a3^b)で原始再帰的です。

1. 部分項は元の項以下の符号をもつので、

Red(a,b)  ⟺  Tm(a)∧∃x≤a ∃y≤b [Rp(a,b,x,y)∧(A(x,y)∨A(y,x)∨B(x,y))]\mathrm{Red}(a,b)\iff\mathrm{Tm}(a)\wedge\exists x\le a\ \exists y\le b\ \bigl[\mathrm{Rp}(a,b,x,y)\wedge(A(x,y)\vee A(y,x)\vee B(x,y))\bigr]

と有界量化で書けます。ここで A(x,y)A(x,y) は「x=⟨2,j,P⟩x=\langle2,j,P\rangle、y=⟨2,k,sb(P,j,⟨0,k⟩)⟩y=\langle2,k,\mathrm{sb}(P,j,\langle0,k\rangle)\rangle、¬Occ(P,k)\neg\mathrm{Occ}(P,k)」、B(x,y)B(x,y) は「x=⟨1,⟨2,i,M⟩,N⟩x=\langle1,\langle2,i,M\rangle,N\rangle、FF(M,i,N)\mathrm{FF}(M,i,N)、y=sb(M,i,N)y=\mathrm{sb}(M,i,N)」で、j,k,P,i,M,Nj,k,P,i,M,N はいずれも xx または yy 以下の範囲の有界量化で取れます。vkv_k が PP に現れなければ vkv_k について捕獲は起きないので、AA の yy は xx と α 同値です。

2. α 同値を上のように読むので、部分項を α 同値な項に取り替えても全体の α 同値類は変わりません。

(i) (α) の 1 ステップは α 同値類を変えません。(β) の 1 ステップは、表し方の中に文字どおり現れる β 基 (λvi.M)N(\lambda v_i.M)N(FF(M,i,N)\mathrm{FF}(M,i,N))を、上で見たとおり M[vi:=N]M[v_i:=N] の表し方 sb(M,i,N)\mathrm{sb}(M,i,N) に取り替えるので、表す項は 定義 3.1 の 1 ステップの β 簡約で移ります(定義 3.1 の →β\to_\beta は適用・抽象の文脈で閉じている)。よって列の長さについての帰納法で、aa の表す項は bb の表す項に ↠β\twoheadrightarrow_\beta で簡約されます。

(ii) ↠β\twoheadrightarrow_\beta のステップ数についての帰納法により、M→βM1M\to_\beta M_1 の場合に、MM の任意の表し方 aa から M1M_1 のある表し方まで Red\mathrm{Red} の列でつながることを示せば足ります。定義 3.1 の導出に関する帰納法で(規則を使うたびに、規則に書かれた束縛変数の名前で表し方を選べば)、MM のある表し方 rr であって、rr の中に β 基 (λvi.M0)N0(\lambda v_i.M_0)N_0 が文字どおり現れ、それを M0[vi:=N0]M_0[v_i:=N_0] の表し方に取り替えると M1M_1 の表し方になるものがとれます。ただし rr は aa と同じとは限りません。そこで次の 3 段でつなぎます。

  • aa と rr は α 同値なので、α 同値の読み方により (α) の付け替え(両向き)の有限列で aa から rr に移れます。これは Red\mathrm{Red} の列です。
  • rr の中で、M0M_0 の束縛変数 λvj\lambda v_j を一つずつ、そのときの項のどこにも現れない新しい変数に (α) で付け替えます(変数は無限個あるので取れる)。得られる M0′M_0' は M0M_0 と α 同値で、そのどの束縛変数も N0N_0 に自由に現れないので FF(M0′,i,N0)\mathrm{FF}(M_0',i,N_0) が成り立ちます。
  • (β) の 1 ステップで β 基 (λvi.M0′)N0(\lambda v_i.M_0')N_0 を sb(M0′,i,N0)\mathrm{sb}(M_0',i,N_0) に取り替えます。これは M0′[vi:=N0]≡M0[vi:=N0]M_0'[v_i:=N_0]\equiv M_0[v_i:=N_0] の表し方なので、得られる項は rr の β 基を M0[vi:=N0]M_0[v_i:=N_0] の表し方に取り替えたもの、すなわち M1M_1 の表し方です。

3. チャーチ数 n‾=λf.λx.fnx\overline n=\lambda f.\lambda x.f^nx と α 同値な項は、λvi.λvj.T\lambda v_i.\lambda v_j.T で TT が viv_i を vjv_j に nn 回適用した項 vi(vi(⋯(vivj)))v_i(v_i(\cdots(v_iv_j))) であり、n≥1n\ge1 なら i≠ji\ne j であるもの(n=0n=0 なら T=vjT=v_j で i=ji=j でもよい)にちょうど限ります(この形は (α) の付け替えで保たれ、nn が同じこの形の項どうしは (α) の付け替えで移り合う)。TT がこの形かどうかと回数 nn は、t=⟨0,j⟩t=\langle0,j\rangle なら回数 00、t=⟨1,⟨0,i⟩,t′⟩t=\langle1,\langle0,i\rangle,t'\rangle なら t′t' の回数 +1+1、それ以外は「この形でない」という累積帰納法(パラメータ i,ji,j)で原始再帰的に計算でき、i,j,Ti,j,T は bb の成分として取り出せます。

4. ν(0)=⟨0,1⟩\nu(0)=\langle0,1\rangle、ν(n+1)=⟨1,⟨0,0⟩,ν(n)⟩\nu(n+1)=\langle1,\langle0,0\rangle,\nu(n)\rangle とおくと、⌜n‾⌝=⟨2,0,⟨2,1,ν(n)⟩⟩\ulcorner\overline n\urcorner=\langle2,0,\langle2,1,\nu(n)\rangle\rangle は nn の原始再帰で定まります。⌜Fn‾⃗⌝=⟨1,⋯⟨1,⟨1,⌜F⌝,⌜n1‾⌝⟩,⌜n2‾⌝⟩⋯ ,⌜nk‾⌝⟩\ulcorner F\vec{\overline n}\urcorner=\langle1,\cdots\langle1,\langle1,\ulcorner F\urcorner,\ulcorner\overline{n_1}\urcorner\rangle,\ulcorner\overline{n_2}\urcorner\rangle\cdots,\ulcorner\overline{n_k}\urcorner\rangle は定数 ⌜F⌝\ulcorner F\urcorner とこれらの合成です。

注意 6.7(簡約の算術化について)

Red\mathrm{Red} の原始再帰性は、計算可能性 でチューリング機械の 1 ステップを算術化した 補題 5.2[計算可能性] と同じ型の作業です。補題 6.6 の証明の要点は、捕獲を避けるための束縛変数の付け替えを置換の中で行わず、(α) の独立した 1 ステップとして Red\mathrm{Red} に入れたことです。付け替えを置換の中で行うと、付け替えた後の項は元の項の部分項ではないので、部分項の符号についての累積帰納法がそのままでは使えません。

定理 6.4 と 計算可能性 の 定理 6.3[計算可能性] を合わせると、チューリング計算可能・再帰的・λ 定義可能の三つが一致します。チャーチがこの一致を根拠に「計算可能 = λ 定義可能」と提唱したのが、チャーチ=チューリングの提唱の起源です。停止問題の決定不能性(定理 7.2[計算可能性])も λ 計算の言葉に移り、「与えられた λ 項が正規形をもつか」は決定不能になります。

注意 6.8(型のない論理の矛盾)

チャーチは当初、λ 計算に論理記号を加えて論理体系を作ろうとしました。しかし型のない体系では、否定 ¬\neg を表す項 NN にも不動点 X=βNXX=_\beta NX があり、「XX は XX の否定と等しい」という嘘つきの文が作れてしまいます(クリーネとロッサーが 1935 年に矛盾を示しました)。不動点定理は計算には恵みですが、論理には毒です。次章では型を付けて自己適用を禁じ、その代わりにすべての計算が止まる(強正規化)体系を得ます。

演習 7.1易

add≡λmnfx.mf(nfx)\mathsf{add}\equiv\lambda mnfx.mf(nfx) について、add m‾ n‾↠βm+n‾\mathsf{add}\,\overline m\,\overline n\twoheadrightarrow_\beta\overline{m+n} を示せ。

解答

add m‾ n‾↠βλfx.m‾f(n‾fx)↠βλfx.m‾f(fnx)↠βλfx.fm(fnx)≡λfx.fm+nx≡m+n‾\mathsf{add}\,\overline m\,\overline n\twoheadrightarrow_\beta\lambda fx.\overline mf(\overline nfx)\twoheadrightarrow_\beta\lambda fx.\overline mf(f^nx)\twoheadrightarrow_\beta\lambda fx.f^m(f^nx)\equiv\lambda fx.f^{m+n}x\equiv\overline{m+n}。各段で、k‾FX↠βFkX\overline kFX\twoheadrightarrow_\beta F^kX を内側の項に使っている(簡約は部分項の中でも行える)。§6 の Lean のコードの add は、この項に型を付けたものです。

演習 7.2標準

M≡(λx.xx)(Iz)M\equiv(\lambda x.xx)(Iz) とする(I≡λy.yI\equiv\lambda y.y)。M→βN1M\to_\beta N_1、M→βN2M\to_\beta N_2 となる二つの項 N1,N2N_1,N_2 で、「N1N_1 と N2N_2 がどちらも高々 1 ステップで同じ項に簡約される」ことのないものを挙げよ。これは 1 ステップの →β\to_\beta が菱形性をもたないことを示す。

解答

N1≡(Iz)(Iz)N_1\equiv(Iz)(Iz)(外側の β 基を縮約)、N2≡(λx.xx)zN_2\equiv(\lambda x.xx)z(引数の β 基を縮約)。N1N_1 から 0 または 1 ステップで行けるのは N1N_1、z(Iz)z(Iz)、(Iz)z(Iz)z の 3 つ。N2N_2 から行けるのは N2N_2、zzzz の 2 つ。共通部分は空である。N1N_1 は 2 ステップで zzzz に着くので、合流はするが歩数がそろわない。並行簡約なら N1⇒zzN_1\Rightarrow zz と 1 歩で行けるので、補題 4.5 の菱形が成り立つのです。

演習 7.3標準

(1) チューリングの不動点結合子 Θ≡AA\Theta\equiv AA(A≡λxy.y(xxy)A\equiv\lambda xy.y(xxy))について、ΘF↠βF(ΘF)\Theta F\twoheadrightarrow_\beta F(\Theta F) を示せ。(2) 不動点を使って、すべての項 XX について GX=βXGGX=_\beta XG となる閉項 GG を作れ。

解答

(1) ΘF≡AAF→β(λy.y(AAy))F→βF(AAF)≡F(ΘF)\Theta F\equiv AAF\to_\beta(\lambda y.y(AAy))F\to_\beta F(AAF)\equiv F(\Theta F)。 (2) G≡Θ(λgx.xg)G\equiv\Theta(\lambda gx.xg) とおく。(1) より G↠β(λgx.xg)GG\twoheadrightarrow_\beta(\lambda gx.xg)G なので、GX↠β(λgx.xg)GX↠βXGGX\twoheadrightarrow_\beta(\lambda gx.xg)GX\twoheadrightarrow_\beta XG。「自分自身を引数に渡す」ような定義も、不動点を使えば名前なしで書けます。

演習 7.4難

前者関数 pd(0)=0\mathrm{pd}(0)=0、pd(n+1)=n\mathrm{pd}(n+1)=n を λ 定義する項を、組を使って直接書け。(ヒント:⟨a,b⟩↦⟨b,b+1⟩\langle a,b\rangle\mapsto\langle b,b+1\rangle を nn 回繰り返す。)

解答

T≡λp.⟨π2p,S(π2p)⟩T\equiv\lambda p.\langle\pi_2p,\mathsf{S}(\pi_2p)\rangle、P≡λn.π1(nT⟨0‾,0‾⟩)\mathsf{P}\equiv\lambda n.\pi_1(nT\langle\overline0,\overline0\rangle) とおく。nn に関する帰納法で n‾T⟨0‾,0‾⟩=β⟨pd(n)‾,n‾⟩\overline nT\langle\overline0,\overline0\rangle=_\beta\langle\overline{\mathrm{pd}(n)},\overline n\rangle を示す。n=0n=0 は 0‾TP↠βP\overline0TP\twoheadrightarrow_\beta P。n→n+1n\to n+1:n+1‾TP=βT(n‾TP)=βT⟨pd(n)‾,n‾⟩=β⟨n‾,S n‾⟩=β⟨pd(n+1)‾,n+1‾⟩\overline{n+1}TP=_\beta T(\overline nTP)=_\beta T\langle\overline{\mathrm{pd}(n)},\overline n\rangle=_\beta\langle\overline n,\mathsf{S}\,\overline n\rangle=_\beta\langle\overline{\mathrm{pd}(n+1)},\overline{n+1}\rangle。よって P n‾=βpd(n)‾\mathsf{P}\,\overline n=_\beta\overline{\mathrm{pd}(n)}。チャーチ数は「繰り返す」ことしかできないので、1 を引くには一つ遅れた値を持ち歩く工夫が要ります。クリーネはこの構成を思いついたことで、λ 定義可能な関数の範囲が広いことを確信したと伝えられています。

  • H. P. Barendregt, The Lambda Calculus: Its Syntax and Semantics, revised ed., North-Holland, 1984 — 第 2・3 章(簡約とチャーチ=ロッサー)、第 6 章(不動点)、第 13 章(正規化)。
  • J. R. Hindley and J. P. Seldin, Lambda-Calculus and Combinators: An Introduction, Cambridge University Press, 2008 — 第 1〜4 章。
  • M. Takahashi, “Parallel reductions in λ-calculus”, Information and Computation 118 (1995), 120–127.
  • A. Church and J. B. Rosser, “Some properties of conversion”, Transactions of the American Mathematical Society 39 (1936), 472–482.
  • S. C. Kleene, “λ-definability and recursiveness”, Duke Mathematical Journal 2 (1936), 340–353.

このテーマの 100 本ノック(100 問)

執筆: Claude Code(Opus 5.5)、Claude Code(Sonnet 5.5)・監査 4 回(Claude Code)・最終 2026-10-12

この記事の誤りを報告する ・運営: 夢現技研合同会社 ・料金 ・利用条件 ・特定商取引法に基づく表記

© 2026 夢現技研合同会社 ・コード例は MIT ライセンスです。