型なしラムダ計算:関数の適用と置換だけで計算を書き尽くす
対象読者: 本テーマの計算可能性の章(チューリング機械・再帰関数)と、数学的帰納法・構造に関する帰納法を学んだ人。ラムダ計算や関数型言語の知識は仮定しません。
前提となる記事:計算可能性:チューリング機械・再帰関数・停止問題とライスの定理、証明の技術:数学的帰納法と背理法はなぜ正しいのか、不変量の原理
0. この記事の要点
Section titled “0. この記事の要点”この記事で扱うのは、「 に を対応させる関数」に名前を付けずに書き、その関数に値を渡して中身を書き換えていく、というだけの小さな計算の体系です。ところがこの体系だけで、数も条件分岐も繰り返しも表せます。読み終えると、「どの順番で書き換えても答えは一つしかない」ことと、「この体系が通常の意味の計算可能な関数をすべて表せる」ことの理由が分かります。
- ラムダ計算は「関数を作る」() と「関数を適用する」() の二つの操作だけからなる計算の体系です。計算の規則は (β 簡約)ただ一つです。
- チャーチ=ロッサーの定理(定理 4.1):どの順番で簡約しても、結果は最後に合流できる。とくに正規形(それ以上簡約できない形)は、存在すればただ一つです。並行簡約と「完全展開」を使って証明します。
- 不動点定理(定理 5.1):任意の項 に対して となる がある。名前のない関数だけで再帰的定義を書けるのは、この定理のおかげです。
- 自然数をチャーチ数 で表すと、λ 定義可能な数論的関数はちょうど再帰関数です(定理 6.4)。チューリング機械と同じ計算能力を、関数の言葉だけで実現しています。
- ラムダ計算は Lisp・Haskell・Lean などの関数型言語の核であり、次章のカリー=ハワード対応で「証明」の計算側の顔になります。
1. 動機:名前のない関数で計算を書く
Section titled “1. 動機:名前のない関数で計算を書く”1.1. 「関数そのもの」を書きたい
Section titled “1.1. 「関数そのもの」を書きたい”数学では のように、関数を名前 と変数 を使って定義します。けれども、関数を「値」として扱いたい場面がよくあります。微分作用素 は関数を受け取って関数を返しますし、積分 は関数を受け取って数を返します。このとき「 に を対応させる関数」を名前なしで書けると便利です。それが という記法で、プログラミング言語では fun x => x^2 + 1(Lean)や lambda x: x**2 + 1(Python)と書きます。
チャーチ (1930 年代) は、この「名前のない関数」と「適用」だけで数学の基礎を作ろうとしました。論理体系としての試みは矛盾で挫折しましたが、残った計算の部分が驚くほど強力でした。数も、真偽値も、組も、再帰も、すべて関数で表せるのです。
1.2. なぜいま学ぶか
Section titled “1.2. なぜいま学ぶか”ラムダ計算には、三つの顔があります。
- 計算のモデル。計算可能性 のチューリング機械と再帰関数に並ぶ、三つ目の定義です。三者が一致することが、チャーチ=チューリングの提唱(注意 6.4[計算可能性])の根拠の一つになりました。この記事で、再帰関数との一致を証明します。
- プログラミング言語の核。関数型言語の評価は β 簡約そのものです。どの順に評価しても答えが同じになる、という安心感の数学的な根拠がチャーチ=ロッサーの定理です。
- 証明の計算的な中身。次章で型を付けると、λ 項がそのまま自然演繹の証明になり、β 簡約が「証明の回り道を取り除く」操作になります(カリー=ハワード対応)。Lean で
theoremの証明として書く項は、型付きの λ 項です。
この記事は型を付けない体系を扱います。型がないので (自分自身への適用)も許され、そこから不動点と無限ループが生まれます。この自由さが計算の万能性の源であり、同時に論理としての矛盾の源でもあります。
2. λ 項と置換
Section titled “2. λ 項と置換”可算無限個の変数 を用意する。λ 項を次で帰納的に定める。
- 変数 は λ 項である。
- が λ 項ならば、適用 は λ 項である。
- が λ 項で が変数ならば、抽象 は λ 項である。
括弧は省略し、適用は左結合()、 の作用域はできるだけ右へ伸ばし、 と書く。自由変数の集合 を 、、 で定める。自由変数をもたない項を閉項という。
と はどちらも恒等関数で、束縛変数の名前だけが違います。束縛変数の付け替えで移り合う項を α 同値(同値関係の一つ)といい、以下では α 同値な項を同一視し、等号 で表します。さらに、ある議論に現れる束縛変数は、自由変数とも互いにも異なるように選んであるものとします(変数の規約)。
なお、条件を満たすように束縛変数を付け替える手順は単純で、 の を の自由変数ではない新しい変数 に取り替え、 の中の自由な も同じ に取り替えるだけです。たとえば なら、先に を と書き直してから置換して とします。
条件 を落とすと、 が になってしまいます。「定数関数 」のはずが恒等関数に化けるわけで、これを変数の捕獲といいます。
証明(補題 2.3)
の構成に関する帰納法。 なら両辺とも 。 なら左辺は ( の置換は を変えない)、右辺は ()。 がそれ以外の変数 なら両辺とも 。 なら帰納法の仮定を各成分に使う。 なら、変数の規約で 、 としてよく、置換は の内側に入るので についての帰納法の仮定に帰着する。
3. β 簡約
Section titled “3. β 簡約”の形の項を β 基(redex)といい、 をその縮約という。項の中の一つの β 基を縮約することを 1 ステップの β 簡約 という。厳密には、 を含み、 ならば 、、 となる最小の関係である。
の反射推移閉包を (簡約)、反射対称推移閉包を (β 同値)と書く。β 基を含まない項を β 正規形といい、 で が正規形のとき、 を の正規形という。
例 3.2(簡約のいろいろな振る舞い)
、、、 とおきます。
- 。()。
- 。 は自分自身にしか簡約されず、正規形をもちません。
- は、先頭の から簡約すれば 2 ステップで になります。一方、引数の ばかり簡約し続けると、いつまでも終わりません。
最後の例は、簡約の順序によって止まったり止まらなかったりすることを示しています。それでも、止まったときの答えは一つしかない、というのが次節の定理です。
4. チャーチ=ロッサーの定理
Section titled “4. チャーチ=ロッサーの定理”1 ステップの について「合流」を示して繰り返す、という素朴な方針はうまくいきません。 で引数のほうを先に縮約すると、もう一方の道では引数が 2 か所にコピーされているので、追いつくのに 2 ステップ必要になるからです。そこで、複数の β 基を同時に縮約する関係を考えます(テイトとマーティン=レーフの方法、高橋の完全展開による簡略化)。
は「 に最初からある β 基を、内側から全部いっぺんに縮約したもの」です。たとえば ()では、引数 の完全展開は 、本体 の完全展開は 自身なので、 です。外側の β 基と引数の β 基が一度に縮約されています。
並行簡約を考える狙いは、次の三角補題にあります。どの並行簡約の行き先 からも、完全展開 という一つの決まった項に 1 歩で追いつける、という主張です。これが菱形性そのものになり、チャーチ=ロッサーの定理が出ます。
証明(補題 4.3)
(1) の構成に関する帰納法で、規則 1〜3 を使う。(2) の定義に関する帰納法。β 基の縮約 は規則 4 と (1)。文脈の中での縮約は、縮約しない部分に (1) を使って規則 2・3 で組み立てる。(3) の導出に関する帰納法。規則 4 なら、帰納法の仮定 、 から 。ほかの規則も同様。最後の主張は (2) と (3) から従う。
証明(補題 4.4)
の導出に関する帰納法。
- 規則 1:。 なら両辺は 。 なら 。
- 規則 2・3:帰納法の仮定をそのまま規則 2・3 に入れる(規則 2 では変数の規約で束縛変数を と から避ける)。
- 規則 4:、、、。変数の規約で 、 とする。帰納法の仮定から 、 なので、規則 4 により
最後の は置換補題(補題 2.3。 を使う)である。右辺は に等しい。
証明(補題 4.5)
の導出に関する帰納法。
- 規則 1:。
- 規則 2:。帰納法の仮定 と規則 2 で 。
- 規則 3:。 が抽象でなければ、帰納法の仮定と規則 3 で 。 なら、 は規則 2 によるしかないので 、 である。帰納法の仮定( と に対して)、 と規則 4 により 。
- 規則 4:。帰納法の仮定 、 と 補題 4.4 により 。
証明(定理 4.1)
(1) であることと、 かつ となる が存在することは同値である。
(2) 正規形は、存在すればただ一つである。さらに で が正規形なら 。
(3) 。とくに はすべての項を等しくするような自明な関係ではない。
証明(系 4.6)
(1) 共通の簡約先が存在すれば、途中を逆にたどって 。逆に、「共通の簡約先をもつ」という関係 は反射的・対称的で を含む。推移的でもある:(共通の簡約先 )、(共通の簡約先 )なら、、 に 定理 4.1 を使って をとると、。 は を含む最小の同値関係なので 。
(2) がともに の正規形なら、(1) より共通の簡約先 がある。正規形は自分自身にしか簡約されないので 。後半も (1) から同様。
(3) 両者は異なる正規形なので、(2) より β 同値でない。
(3) は地味ですが重要です。β 同値を「等式」とみなす体系(λ 理論)が無矛盾であることを、この定理が保証しています。
注意 4.7(正規形の見つけ方)
例 3.2 の のように、正規形があっても簡約の順序しだいで止まらないことがあります。最左最外の β 基(最も左にある から始まる β 基)を常に縮約する戦略をとると、正規形があれば必ずそこに到達することが知られています(正規化定理。Barendregt の教科書の第 13 章)。この記事では使わないので、証明は省略します。
5. 不動点と再帰
Section titled “5. 不動点と再帰”型のない世界では、すべての項に不動点があります。
証明(定理 5.1)
とおくと、。一方 。両者は共通の簡約先 をもつので 。 とすればよい。
は に簡約されるわけではなく、両者が共通の項に簡約されるだけです。「 と は、どちらも計算すれば になるので等しい」というのと同じ感覚で、 は「簡約の向きは問わず、どこかで合流する」という関係です。簡約の向きまで欲しいときは、チューリングの不動点結合子 を使います。 は 2 ステップで確かめられます(演習)。
不動点定理は、再帰的定義を名前なしで書く方法を与えます。「」と自分自身を参照して定義したい関数があれば、右辺の を変数として抽象した をつくり、 をとればよいのです。定理 6.4 の証明で、最小化をこの方法で実現します。
6. λ 定義可能性と再帰関数
Section titled “6. λ 定義可能性と再帰関数”6.1. チャーチ数と基本的な符号化
Section titled “6.1. チャーチ数と基本的な符号化”この節では 計算可能性 に合わせて も自然数に含め、 とします。
チャーチ数 は「関数を 回繰り返す」という操作そのものです。すぐに確かめられる性質として、任意の について 。そこから が従います(両辺とも に簡約される)。
証明(補題 6.2)
(1) ()。(2) 、。(3) 、。(4) (または )( なら )。
例 6.3(チャーチ数の演算)
- 後者 :。
- 真偽値 、。、 なので、 が「if then else 」になる。
- ゼロ判定 :、。
- 組 、射影 、:。
型付きの言語でも、型を固定すればチャーチ数を書けます。次の Lean 4 のコード(標準ライブラリだけで動きます)は、 と の和を計算し、#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 := rflfun f x => ... が です。#reduce は項を β 簡約(と定義の展開)で正規形にして表示するコマンドで、出力はチャーチ数 そのものになっています。ただし Lean では や は型が付かないので書けません。その理由は次章で明らかになります。
6.2. 再帰関数は λ 定義可能
Section titled “6.2. 再帰関数は λ 定義可能”全関数 について、 が再帰関数(定義 4.1[計算可能性] の意味で、全関数である部分再帰関数)であることと、λ 定義可能であることは同値である。
証明の方向は二つあります。再帰関数から λ 項を作る向きでは、再帰関数の生成規則(合成・原始再帰・最小化)を一つずつ λ 項で実現します。逆向きでは、λ 項の簡約の列を数で表して、簡約を追うことが再帰関数で書けることを示します。
まず、再帰関数の作り方を「全関数のまま」で言い直しておきます。
再帰関数全体は、基本関数(ゼロ・後者・射影)を含み、合成、原始再帰、および正則な最小化(全関数 で、各 に となる が存在するものへの )で閉じた最小の関数族に等しい。
証明(補題 6.5)
この族の元は明らかに全関数である部分再帰関数である。逆に を再帰関数とすると、チューリング機械で計算でき(定理 6.2[計算可能性])、クリーネの標準形定理(定理 5.3[計算可能性])により
と書ける。 は原始再帰的で、 が全関数だから各 について となる が存在する。したがって は の否定の特性関数 への正則な最小化であり、 はこの族に属する。
次の証明の見どころは最小化です。「 と順に を試し、最初に成り立った を返す」という繰り返しを、不動点(§5)を使って 「 なら 、そうでなければ 」という形の項で書きます。長い項 は、この if 文( と )に、自分を呼び直す を で受け取らせたものにすぎません。
証明(定理 6.4)
(再帰的 ⇒ λ 定義可能) 補題 6.5 の生成規則ごとに、λ 定義可能な関数の族が閉じていることを示す。以下 は変数の列 、 は数の列 を表す。
- 基本関数:ゼロは 、後者は (補題 6.2)、射影 は 。
- 合成: が を定義するなら、 について 。 が項の部分の置き換えと両立することを使っている。
- 原始再帰:、 で、 が を定義するとする。 とおき、 に を代入したものを と書く。 に関する帰納法で を示す。 は と から。 は
よって が を定義する。
- 正則な最小化: で、 が を定義するとする。 とおき、 としたものを と書く。(、 なので )から
なら右辺は 、そうでなければ 。 は となる最小の なので、。よって が を定義する。
(λ 定義可能 ⇒ 再帰的) λ 項をゲーデル数で符号化する(定義 4.1[ゲーデルの不完全性定理] と同じ素数冪の方法で、変数 、適用、抽象を符号化する)。次の 3 つが原始再帰的であること(補題 6.6)を使う。(a) :「 は から束縛変数の付け替え 1 回か、捕獲の起きない β 基の縮約 1 回で得られる項の符号」(補題 6.6 の 1。その 2 の (i)(ii) により、 の列は をちょうど表す)。(b) :「 はあるチャーチ数(と α 同値な項)の符号」と、そのときの値 (同 3)。(c) (同 4)。これらから「 は から始まり でつながり、チャーチ数で終わる列の符号」という述語 も原始再帰的になる(命題 3.2[計算可能性] の有界量化と復号 )。
で は正規形だから、系 4.6 (2) により 。したがって 補題 6.6 の 2 (ii) により、各 について を満たす が存在する。さらに、そのような列が到達するチャーチ数は、同じく 2 (i) により から で到達する正規形なので、正規形の一意性によって に限る。ゆえに
であり、正則な最小化と原始再帰関数の合成なので は再帰関数である。
次の補題は、簡約の列を自然数で表し、「ある列が簡約として正しいか」を原始再帰関数で判定できることを示すものです。計算可能性の章でチューリング機械の 1 ステップを数で表したのと同じ作業を、λ 項について行います。証明の中の累積帰納法は、「小さい符号での値を全部使って次の値を決める」再帰の形を、原始再帰に直すための道具です。細部が多いので、まず補題の主張だけ読み、全体の流れは上の説明で追うのがよいでしょう。
変数を とし、(α 同値で同一視する前の)項に符号を 、、 で与える()。 を「 は項の符号で、 は、 の項の部分項 1 つを、(α) と ( は に現れない変数)の一方から他方に付け替えるか、(β) β 基 で のどの ()の作用域にも自由な がないものを、 の自由な を に置き換えた項に縮約して得られる項の符号」とする。ここで §2 の α 同値(束縛変数の付け替えで移り合うこと)は、(α) の付け替えを部分項に有限回施して移り合うこと、と精密に読む(Barendregt の教科書の定義と同じ)。このとき
- は原始再帰的である。
- (i) 符号 から符号 まで の有限列でつながるならば、 の表す項は の表す項に で簡約される。(ii) ならば、 の任意の表し方の符号 から、 のある表し方の符号まで の有限列でつながる。
- 「 はあるチャーチ数と α 同値な項の符号」と、そのときの値 ( でなければ )は原始再帰的である。
- 閉項 を固定すると、 は原始再帰的である。
証明(補題 6.6)
道具は 命題 3.2[計算可能性] です。符号の第 成分は で取り出せ、 なので各成分は元の符号より真に小さい。項の符号であるかどうか、種類()、成分は、以下の累積帰納法で原始再帰的に判定・計算できます。
累積帰納法。 が原始再帰的で 、( 未満での値の履歴)と定まる は原始再帰的です。実際 、 は原始再帰で、 です。 での値は として の中で使えます。以下の定義はどれも、値を真に小さい符号での値から場合分け(同 2)で決めるので、この形に入ります。パラメータ( など)は再帰の間固定です。
基本の関数。 「 は項の符号」は、 であるか、 で か、 で であること( は の成分)で、累積帰納法です。「 が に(束縛の位置も含めて)現れる」、「 が に自由に現れる」は成分についての累積帰納法です(たとえば )。捕獲が起きない条件 を は真、、 は真、 なら で定めます。付け替えのない置換 を
で定めます。右辺の再帰呼び出しはすべて の成分( より小さい)なので、累積帰納法で原始再帰的です。
が項 の符号で ならば、 は 定義 2.2 の の表し方の符号です。 についての帰納法で確かめます。まず、 が に自由に現れなければ、( についての帰納法)かつ (定義 2.2 の各式に沿った帰納法)です。変数と適用の場合は 定義 2.2 の式どおりです。 で かつ なら、定義 2.2 の最後の式がそのまま使え、 なので に帰納法の仮定が使えます。残りは の場合と、 かつ の場合です。前者では は に自由に現れず、後者では の定義により は に自由に現れないので、やはり に自由に現れません。どちらも最初に述べたことに帰着します。
部分項の置き換え。 「 は の部分項 の 1 か所を に置き換えたもの」は、、または 、 で()か()、または 、 で 、で定めます。再帰呼び出しでは と がともに成分に置き換わるので、 についての累積帰納法()で原始再帰的です。
1. 部分項は元の項以下の符号をもつので、
と有界量化で書けます。ここで は「、、」、 は「、、」で、 はいずれも または 以下の範囲の有界量化で取れます。 が に現れなければ について捕獲は起きないので、 の は と α 同値です。
2. α 同値を上のように読むので、部分項を α 同値な項に取り替えても全体の α 同値類は変わりません。
(i) (α) の 1 ステップは α 同値類を変えません。(β) の 1 ステップは、表し方の中に文字どおり現れる β 基 ()を、上で見たとおり の表し方 に取り替えるので、表す項は 定義 3.1 の 1 ステップの β 簡約で移ります(定義 3.1 の は適用・抽象の文脈で閉じている)。よって列の長さについての帰納法で、 の表す項は の表す項に で簡約されます。
(ii) のステップ数についての帰納法により、 の場合に、 の任意の表し方 から のある表し方まで の列でつながることを示せば足ります。定義 3.1 の導出に関する帰納法で(規則を使うたびに、規則に書かれた束縛変数の名前で表し方を選べば)、 のある表し方 であって、 の中に β 基 が文字どおり現れ、それを の表し方に取り替えると の表し方になるものがとれます。ただし は と同じとは限りません。そこで次の 3 段でつなぎます。
- と は α 同値なので、α 同値の読み方により (α) の付け替え(両向き)の有限列で から に移れます。これは の列です。
- の中で、 の束縛変数 を一つずつ、そのときの項のどこにも現れない新しい変数に (α) で付け替えます(変数は無限個あるので取れる)。得られる は と α 同値で、そのどの束縛変数も に自由に現れないので が成り立ちます。
- (β) の 1 ステップで β 基 を に取り替えます。これは の表し方なので、得られる項は の β 基を の表し方に取り替えたもの、すなわち の表し方です。
3. チャーチ数 と α 同値な項は、 で が を に 回適用した項 であり、 なら であるもの( なら で でもよい)にちょうど限ります(この形は (α) の付け替えで保たれ、 が同じこの形の項どうしは (α) の付け替えで移り合う)。 がこの形かどうかと回数 は、 なら回数 、 なら の回数 、それ以外は「この形でない」という累積帰納法(パラメータ )で原始再帰的に計算でき、 は の成分として取り出せます。
4. 、 とおくと、 は の原始再帰で定まります。 は定数 とこれらの合成です。
注意 6.7(簡約の算術化について)
の原始再帰性は、計算可能性 でチューリング機械の 1 ステップを算術化した 補題 5.2[計算可能性] と同じ型の作業です。補題 6.6 の証明の要点は、捕獲を避けるための束縛変数の付け替えを置換の中で行わず、(α) の独立した 1 ステップとして に入れたことです。付け替えを置換の中で行うと、付け替えた後の項は元の項の部分項ではないので、部分項の符号についての累積帰納法がそのままでは使えません。
定理 6.4 と 計算可能性 の 定理 6.3[計算可能性] を合わせると、チューリング計算可能・再帰的・λ 定義可能の三つが一致します。チャーチがこの一致を根拠に「計算可能 = λ 定義可能」と提唱したのが、チャーチ=チューリングの提唱の起源です。停止問題の決定不能性(定理 7.2[計算可能性])も λ 計算の言葉に移り、「与えられた λ 項が正規形をもつか」は決定不能になります。
注意 6.8(型のない論理の矛盾)
チャーチは当初、λ 計算に論理記号を加えて論理体系を作ろうとしました。しかし型のない体系では、否定 を表す項 にも不動点 があり、「 は の否定と等しい」という嘘つきの文が作れてしまいます(クリーネとロッサーが 1935 年に矛盾を示しました)。不動点定理は計算には恵みですが、論理には毒です。次章では型を付けて自己適用を禁じ、その代わりにすべての計算が止まる(強正規化)体系を得ます。
について、 を示せ。
解答
。各段で、 を内側の項に使っている(簡約は部分項の中でも行える)。§6 の Lean のコードの add は、この項に型を付けたものです。
演習 7.2標準
とする()。、 となる二つの項 で、「 と がどちらも高々 1 ステップで同じ項に簡約される」ことのないものを挙げよ。これは 1 ステップの が菱形性をもたないことを示す。
解答
(外側の β 基を縮約)、(引数の β 基を縮約)。 から 0 または 1 ステップで行けるのは 、、 の 3 つ。 から行けるのは 、 の 2 つ。共通部分は空である。 は 2 ステップで に着くので、合流はするが歩数がそろわない。並行簡約なら と 1 歩で行けるので、補題 4.5 の菱形が成り立つのです。
演習 7.3標準
(1) チューリングの不動点結合子 ()について、 を示せ。(2) 不動点を使って、すべての項 について となる閉項 を作れ。
解答
(1) 。 (2) とおく。(1) より なので、。「自分自身を引数に渡す」ような定義も、不動点を使えば名前なしで書けます。
前者関数 、 を λ 定義する項を、組を使って直接書け。(ヒント: を 回繰り返す。)
解答
、 とおく。 に関する帰納法で を示す。 は 。:。よって 。チャーチ数は「繰り返す」ことしかできないので、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.
執筆: Claude Code(Opus 5.5)、Claude Code(Sonnet 5.5)・監査 4 回(Claude Code)・最終 2026-10-12
この記事の誤りを報告する ・運営: 夢現技研合同会社 ・料金 ・利用条件 ・特定商取引法に基づく表記
© 2026 夢現技研合同会社 ・コード例は MIT ライセンスです。