回答:
停止の問題は特定できませんが、ほとんどのプログラムでは、明らかな無限ループを探すことで、停止するかどうかを簡単に確認できることに異議を唱える人もいるかもしれません。逆に、プログラムが常に終了するようにしたい場合は、すべてのループのループ反復の数をアプリオリに制限することで終了できます。たとえば、二乗を繰り返すための疑似コードを考えてみます。
def power(x, y, p):
"compute x^y mod p"
assert y >= 0
result = 1
while y > 0:
if x is odd: result = result * x (mod p)
y = y div 2
x = x * x
return result
この手順が常に終了することをどうやって知るのですか?1つの方法は、事前にループをバインドすることです。
def power(x, y, p):
"compute x^y mod p"
assert y >= 0
bound = y
result = 1
loop bound times:
if x is odd: result = result * x (mod p)
y = y div 2
x = x * x
if y == 0: break
return result
これで、このプログラムが終了することは明らかです。他の場所で間違いがなければ、2つのプログラムは同じ出力を生成します。
プリミティブ再帰関数は、すべてのループが制限されており、再帰がないプログラムによって計算される関数です。
再帰は許可されていませんが(境界がないため)、ループでシミュレートできます。ここで、いくつかの質問をすることができます。
1に答えると、アッカーマン関数のように、「速く」成長する特定の計算可能な関数が原始的な再帰的ではないことを示すことができます。逆に、成長率が「合理的」であるすべての関数は、原始的な再帰的です。そして、すべての計算可能な関数は、フォームで述べることができます プリミティブな再帰 、私たちが考えるところ 述語として。
bound
はすべて、プリミティブな再帰関数で計算可能でなければなりません。2)「プリミティブ再帰」という用語を「再帰を使用しない」と説明するのは奇妙です。私たちはできる再帰だけではない任意の種類を使用しています。
私の計算能力コースを受講したとき、これは次のように紹介されました:
プリミティブな再帰は、計算を定義する自然な方法です(数学の知識がある場合はおそらく明白です。プログラマにとっては、再帰は逆方向のループであると理解しやすいでしょう)。
したがって、プリミティブな再帰を習得したら、疑問に思うでしょう。
まあ、そうではありません。まず、未定義の値が不足しています。では、プリミティブな再帰を部分的なプリミティブな再帰関数に拡張できます。
それでも、プリミティブな再帰的ではないいくつかの(完全な)計算可能な関数があります。まあ、アッカーマンはその一つです。そのため、アッカーマン関数が重要です。「再帰」は「プリミティブな再帰+最小化」であることが判明し、証明することはできませんが、計算することはこれですべてです。
したがって、原始的な再帰関数は重要です。
確かではありません-多分誰かが知っているでしょう-しかし、アッカーマンが彼の関数を思いつく前に、数学者は計算可能=プリミティブな再帰+部分関数であると考えていました。