ラムダ計算 #2 簡約
ラムダ計算セルフブログリレー(今命名)2日目です. 今日も平常運転, くまちゃんです. 1日目はこちら
kumachan-math.hatenablog.jp
はてなブログにはカテゴリーなるものがあって記事を分類できるらしいことがわかったので, カテゴリ名に「ラムダ計算」とつけてみました. センスのかけらもありませんね. まあそんなもんです.
どうでもいいんだけど, 記事のカテゴリ分類を自動でやってカテゴリを振ってくれたりしないかなって思ったりしました. それただのクラシフィケーションの問題ですね. というか絶対誰かやってるでしょ. ブログはみんな書いてるからデータと正解ラベルあるし, なんなら勝手にデータ増えていくから研究はしやすそうよね. 最初と最後の方にテーマやまとめとしてカテゴリ名に関連する単語が出て来やすいとかで特徴量取れるだろうし, ディープラーニングなんて重い処理しなくても解けそう.
まあ愚痴はこの辺にしておきましょうか.
昨日は, 変数やラムダ式とはなんぞやというもの定義したので, 今日から本題です. 簡約を扱います.
簡約とは, いわゆる計算を進めていく操作, 評価のことです. 5 + 3を8に置き換えるのは簡約と言えるし, 階乗関数 をに置き換えるのも簡約です. まず1番最初は, 何らかのラムダ式の簡約ができたとすると, それが全体のラムダ式にどのように作用するのかということを推論規則として定めておきます.
定義2.1. 簡約の推論規則
を変数全体の集合, をラムダ式全体の集合とする. , とする.
1つ目と2つ目の規則から, ラムダ式が連接している時には, 右から評価しても左から評価しても良い, つまりどんな順番で評価しても良いということをいっています. これにより, ラムダ式の評価の仕方には任意性があることがわかります. これについては後述します. 3つ目の推論規則は, 束縛変数を持つラムダ式は, その中身だけを独立に評価するということを言っています.
次に, なるラムダ式のイメージを定式化します. このラムダ式はイメージ的には変数を引数にとってラムダ式を返す関数といったような感じです. それを式で表したのが簡約です.
定義2.2 簡約と代入
を変数全体の集合, をラムダ式全体の集合とする. , とする.
これを日本語にすると, 「束縛変数を持つラムダ式に別のラムダ式を作用させることは, の中のをに置き換えることで評価できます」となります. これによって, 束縛変数への「代入」なる概念が定義できたことになります.
次に, 束縛変数の名前を変更しても良いということを変換として定めておきます.
定義2.3 変換と変数名変更
を変数全体の集合, をラムダ式全体の集合とする. , , とする.
これは例えば, とは相互に変更できるべきだということを言っています. 今までと呼んでいた引数名を新しくと名前を変えたとしても, 何ら問題はないということです. これは計算を進める簡約ではないので, 変換と呼ばれます. ただし, のように自由変数を含む関数の場合, これはとは異なることに注意しなければいけません.
さて, 今までなんていう記号をさらっと使っていましたが, これは当然未定義記号です. ここで定義しておきます.
定義2.4.
を変数全体の集合, をラムダ式全体の集合とする.
1番目, 3番目のルールは特に説明する必要はないでしょう. 2番目のルールは少し複雑です.
が束縛変数なら, それをどんなラムダ式に変えても意味がありません. 例えば. のという名前を今勝手にとかしてとしても関数の意味は変わりませんよね.
次にが自由変数であって, 変更先のラムダ式の自由変数の中に束縛変数が含まれていないなら, 中身のラムダ式のだけをそのままに置き換えても良いです. 例えば, のをに変えた場合は, の部分をに変えればいいですが, をに変えてしまうとになってしまって意味が変わってしまいますよね.
この意味が変わってしまう場合, すなわち, のなかの自由変数をに置き換えたいんだけれど, のなかに束縛変数が含まれてしまっていたら, どうしたらいいでしょうか. この場合は簡単です. 今までと呼んでいた束縛変数を, 今相手にしているラムダ式たちと全く関係のない新しい名前に呼び直してしまえばいいのです. は全く関係のない名前でなければいけない, というのが
「ただし, 」
の部分に含まれています.
次に, 簡約と展開について触れておきます. これは関数は入力となる引数のラムダ式と出力となるラムダ式が全て等しければ互いに変換できて良いだろうというルールです.
定義2.5 簡約と展開, 外延的等しさ
を変数全体の集合, をラムダ式全体の集合とする. , とする.
を簡約, 展開という.
を勝手に1つ取るとき,
()
また,
となるので,
を得ます. 引数となるは, ラムダ式でさえあればなんでも良いのですから, このなんでもいい引数を取り去ってしまって, と自体を相互に変換できると考えても良いのではないか, というのが簡約と展開です.
言い直すと, どんな引数に対してもそれぞれ返り値が等しいのだから, 関数として相互に変換できて良いのではないかということです. この忌避数と返り値のペアが等しいという外延的等しさを認めるのが簡約と展開です.
さて, 簡約()が定義できたので, 2つのラムダ式が等しい()という概念を定義できます.
定義2.6. ラムダ式の等しさ
ラムダ式の間の関係を で定める. すなわち2つのラムダ式とが等しいとは, に対して簡約とその逆操作である展開を施してにできることである.
例:2.7 等しいラムダ式
証明:
ここまで簡約について, 色々とやってきましたが, 簡約を進めていくといずれこれ以上簡約できない形になることが予想できます. これを正規形といいます.
ところが, どれだけ頑張って簡約をしていったとしても, 正規系にならないラムダ式も存在します. すなわち簡約が無限に続くということです.
例を1つあげます. 簡単です.
これを簡約すると
元に戻ってしまいました. 無限ループです本当にありがとうございました.
また, 簡約の仕方は1つでないといいました. その例を1つあげてみましょう.
ご指摘を受けて修正しました.
修正前 :
これは, 先に外側から見て,
ご指摘を受けて修正しました.
修正前 :
ともできるし, 先に内側から見て,
ご指摘を受けて修正しました.
修正前 :
ともできます. すなわち, ラムダ式の簡約には複数の「戦略」があると言えます. またこのとき, 簡約と正規形には次の3タイプに分けることができると言えます.
- どのような戦略を取っても正規形に必ずなるもの. 例:
- どのような戦略を取っても必ずいつまでも正規形にならないもの. 例:
- 戦略によって, 正規形になったり, いつまでもならなかったりするもの. 例
3つ目の例としてあげたものは, になんかの引数が食わされていると考えれば, すぐにに簡約できますが, が何らかのラムダ式の引数になっていると捉えると, いつまでも簡約が終わりません. したがって, ラムダ計算においてはこの簡約戦略が非常に重要であるということがわかります.