[#情報数学](情報数学) [#理論計算機科学](理論計算機科学) - [[原始再帰関数]], [[Primitive Recursive Function]]とも 定義 次の関数を原始帰納的関数という - いくつかの決められた関数は原始帰納的関数である - 定数関数$zero : N^0 \rightarrow N$, $zero() = 0$ - 後者関数$suc : N \rightarrow N$, $suc(x) = x + 1$(xの次の数を返す) - 写影関数$\pi^n_i : N^n \rightarrow N$, $\pi^n_i(x_1, x_2, ..., x_n) = x_i$ (セレクタ) - 原始帰納的関数の合成は原始帰納的関数である - $g : N^m \rightarrow N$と$h_i : N^n \rightarrow N (i = 1, 2, ..., m)$が原始帰納的関数のとき、$f : N^n \rightarrow N, f(x_1, x_2, ..., x_n) = g(h_1(x_1, x_2, ..., x_n), ..., h_m(x_1, x_2, ..., x_n))$も原始帰納的関数である - 原始帰納法による関数の定義 - $g: N^n \rightarrow N$と$h : N^{n+2} \rightarrow N$が原始帰納的関数のとき、次のように定義した$f : N^{n+1} \rightarrow N$も原始帰納的関数である - $f(x_1, x_2, ..., x_n, 0) = g(x_1, x_2, ..., x_n)$ - $f(x_1, x_2, ..., x_n, suc(y)) = h(x_1, x_2, ..., x_n, y, f(x_1, x_2, ..., x_n, y))$ 例 - イデアル関数: `id(x) = x` - 定数関数: `one() = 1` - `add2(x) = suc(suc(x))` ←合成 - 2倍 - インクリメント(suc)を2x回すればいい - `double(0) = 0` - `double(suc(x)) = suc(suc(double(x)))` - 前者関数: `pred(suc(y)) = y`, `pred(0) = 0` - 足し算 - yの数だけ、xをインクリメント(suc)すればいい - `add(x, suc(y)) = suc(add(x, y))`, `add(x, 0) = x` - 引き算 - 足し算の逆 - `sub(x, 0) = x`, `sub(x, suc(y)) = pred(sub(x, y))` - 掛け算 - `mul(x, 0) = 0`, `mul(x, suc(y)) = add(x, mul(x, y))` - max: - max(x, y) = add(sub(x, y), x) - 別の方法 - `max(x, y) = tmp(x, y, sub(x, y))`, `tmp(x, y, 0) = y`, `tmp(x, y, d) = x` [[計算可能性]] - 原始帰納的関数は[[計算可能]] - 証明 - $zero, suc, \pi^n_i$は計算可能である - 計算可能であるということはフローチャートで書ける or whileで表現できるということだから、フローチャートを書いてあげればいい - フローチャートに起こせれば計算可能、ということの意味がよくわかってない(kekeho) - 原始帰納的関数の合成は計算可能である - $f(x_1, x_2, ..., x_n) = g(h_1(x_1, x_2, ..., x_n), ..., h_m(x_1, x_2, ..., x_n))$ - これもフローチャートを書いてあげればいい - 原始帰納法は計算可能である - $f(x_1, x_2, ..., x_n, 0) = g(x_1, x_2, ..., x_n)$ - $f(x_1, x_2, ..., x_n, suc(y)) = h(x_1, x_2, ..., x_n, y, f(x_1, x_2, ..., x_n, y))$ - これもフローチャートを書いてあげればいい その他 - [[for文]]に近い - 原始帰納的関数 $\sub$ 計算可能関数 $\sub$ 関数 - 原始帰納的関数は[[全域的関数]]([[Total function]]) - 全域的: 入力に対して出力が必ずある - コンピュータが計算する関数は全域的関数とは限らない - [[部分的関数]]であることもある - 部分的: 入力に対して出力がないこともある - ![[assets/6627098218e9e200256d3aea.png]] - 奇数のときには止まらない - 全域的で計算可能だが、原始帰納的でない関数もある - [[アッカーマン関数]] $A: N^2 \rightarrow N$ - $A(0, y) = suc(y)$ - $A(suc(x), 0) = A(x, suc(0))$ - $A(suc(x), suc(y)) = A(x, A(suc(x), y))$ - 原始帰納的関数よりかなり計算量を食う 資料 - [https://www.kurims.kyoto-u.ac.jp/~cs/lecture/2008/prf.pdf](https://www.kurims.kyoto-u.ac.jp/~cs/lecture/2008/prf.pdf) - [https://web.sfc.keio.ac.jp/~hagino/mi20/02.pdf](https://web.sfc.keio.ac.jp/~hagino/mi20/02.pdf) - ![](https://www.youtube.com/watch?v=hFivqlna0Xw&t=1s)