定義 次の関数を原始帰納的関数という
- いくつかの決められた関数は原始帰納的関数である
- 定数関数,
- 後者関数, (xの次の数を返す)
- 写影関数, (セレクタ)
- 原始帰納的関数の合成は原始帰納的関数である
- とが原始帰納的関数のとき、も原始帰納的関数である
- 原始帰納法による関数の定義
- とが原始帰納的関数のとき、次のように定義したも原始帰納的関数である
- とが原始帰納的関数のとき、次のように定義したも原始帰納的関数である
例
- イデアル関数:
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
- 原始帰納的関数は計算可能
- 証明
- は計算可能である
- 計算可能であるということはフローチャートで書ける or whileで表現できるということだから、フローチャートを書いてあげればいい
- フローチャートに起こせれば計算可能、ということの意味がよくわかってない(kekeho)
- 計算可能であるということはフローチャートで書ける or whileで表現できるということだから、フローチャートを書いてあげればいい
- 原始帰納的関数の合成は計算可能である
- これもフローチャートを書いてあげればいい
- 原始帰納法は計算可能である
- これもフローチャートを書いてあげればいい その他
- は計算可能である
- 証明
- for文に近い
- 原始帰納的関数 計算可能関数 関数
- 原始帰納的関数は全域的関数(Total function)
- 全域的: 入力に対して出力が必ずある
- コンピュータが計算する関数は全域的関数とは限らない
- 部分的関数であることもある
- 部分的: 入力に対して出力がないこともある
- 奇数のときには止まらない
- 部分的関数であることもある
- 全域的で計算可能だが、原始帰納的でない関数もある
- アッカーマン関数
- 原始帰納的関数よりかなり計算量を食う
- アッカーマン関数
- 原始帰納的関数は全域的関数(Total function)
資料