計算論を読んだ
- 高橋正子 計算論 計算可能性とラムダ計算 (コンピュータサイエンス大学講座)
面白かったところや、自分の理解のまとめ。他にも色々載ってる良い本。
帰納的関数
- 原始帰納的関数
- ざっくり言うと、c言語で
for (int i = 0; i < n; ++i) { ... }
の形のfor文だけ、while文や再帰呼び出し禁止で書けるようなものに対応する関数 - 全域的、プログラムで言うと必ず停止する
- 必ず停止するからといって、これに含まれるとは限らない
- ざっくり言うと、c言語で
- 帰納的関数
- 原始帰納的関数に$\mu$演算子を加えたもの
- $\mu$ 演算子とはwhile文に相当するもの
- turing機械で計算できるのと一緒
- 部分関数を含む、つまり停止するとは限らない
- $\mu$演算子は高々1つあれば十分、つまりプログラムに無限loopになりうるloopは1つでよい
- 原始帰納的関数に$\mu$演算子を加えたもの
型無し$\lambda$計算
- Church-Rosser性
- $\lambda$式は好きな順に簡約しても最終結果は不変
- 正規化定理
- もし$\beta$簡約を終わらせられるなら、左から簡約していけば終わる
- 値渡しだと動かないけど名前渡しなら動くプログラムがあるよ、ということぽい
領域理論
- プログラムで用いるデータ構造って数学的な対象でいうとどんなの? -> 完備半順序集合(cpo)が妥当
- エラーだとか無限ループ表したい
- 情報量の大小を順序にして、エラーとかは最小元と解釈しよう
- 計算の極限を表したい
- プログラムは円周率の真の値を算出することはできないけど、
3
,3.1
,3.14
,3.141
,3.1315
, … というように近付く列はいくらでも計算できて、その極限は真の値 fact n = n * fact (n - 1)
みたいな再帰してる関数を展開しきるのは無理だけど、0回, 1回, 2回, 3回, … とどんどん展開していくことはできて、その極限は無限に展開した結果- そういった列に極限が存在してほしい
- プログラムは円周率の真の値を算出することはできないけど、
- エラーだとか無限ループ表したい
- じゃあプログラムは数学的な関数でいうとどんなの? -> 連続関数
- 上の要求がいい感じになればよい
- 単調
- 情報量がひっくり返ったりしては困る
- 極限を保存する
- 極限がちゃんと扱えなきゃ困る
- 領域方程式
- $\lambda$式って関数かつ値なので困る
- $X \simeq [X -> X]$な$X$を探す
- $F(X) = [X -> X]$とすると$X$は不動点
- $\lambda$式って関数かつ値なので困る
$\lambda$計算のmodel
- 幾つかの公理を満たす数学的構造
- $D_\infty$
- 任意のcpoを始点に構成される無限列が台集合
- 表したいのはその極限
- Cauchy列による実数の定義と似てる気がする
- むりやり領域方程式を解いた
- 表したいのはその極限
- 圏論勉強会の動画なんかでちょっと触れられてたやつ
- 別に圏論がなくても語れる
- $\lambda$式の簡約の極限が反映された構造
- これでの解釈で作られる$\lambda$式の同値関係は、$\beta$同値でなくても計算結果が極限的に一致する場合等しい
- 任意のcpoを始点に構成される無限列が台集合
- $P_\omega$
- 自然数の集合の全体が台集合
- $\mathbb{N}\times\mathbb{N}$と$\mathbb{N}$は濃度が同じなので埋め込める
- $D_\infty$と比べると手軽
- 極限だとかが不要な場合こちらを使う
- 自然数の集合の全体が台集合