意味 原始的な再帰関数は、固定数の引数(それぞれが自然数(非負整数:{0, 1, 2, ...}))を受け取り、自然数を返します。n 個の 引数を受け取る場合、 n 進関数 と呼ばれます。
基本的な原始再帰関数は、以下の公理 によって与えられる。
定数関数C n k {\displaystyle C_{n}^{k}} : 各自然数についてn {\displaystyle n} そしてすべてのk {\displaystyle k} 、k 項定数関数、定義はC n k ( x 1 、 … 、 x k ) = d e f n {\displaystyle C_{n}^{k}(x_{1},\ldots ,x_{k})\ {\stackrel {\mathrm {def} }{=}}\ n} は原始的な再帰です。後継関数 :引数の後継関数を返す1 項後継関数S ( ペアノ公準を 参照)、すなわち、S ( x ) = d e f x + 1 {\displaystyle S(x)\ {\stackrel {\mathrm {def} }{=}}\ x+1} は原始的な再帰です。射影関数 P 私 k {\displaystyle P_{i}^{k}} : すべての自然数について私 、 k {\displaystyle i,k} そのため1 ≤ 私 ≤ k {\displaystyle 1\leq i\leq k} 、k 項関数は次のように定義される。P 私 k ( x 1 、 … 、 x k ) = d e f x 私 {\displaystyle P_{i}^{k}(x_{1},\ldots ,x_{k})\ {\stackrel {\mathrm {def} }{=}}\ x_{i}} 原始再帰です。これらの公理によって与えられる演算 を適用することで、より複雑な原始再帰関数を得ることができます。
合成演算子 ∘ {\displaystyle \circ \,} (置換演算子 とも呼ばれる):m 項関数が与えられた場合h ( x 1 、 … 、 x m ) {\displaystyle h(x_{1},\ldots ,x_{m})\,} およびm k 項関数g 1 ( x 1 、 … 、 x k ) 、 … 、 g m ( x 1 、 … 、 x k ) {\displaystyle g_{1}(x_{1},\ldots ,x_{k}),\ldots ,g_{m}(x_{1},\ldots ,x_{k})} :h ∘ ( g 1 、 … 、 g m ) = d e f f 、 どこ f ( x 1 、 … 、 x k ) = h ( g 1 ( x 1 、 … 、 x k ) 、 … 、 g m ( x 1 、 … 、 x k ) ) 。 {\displaystyle h\circ (g_{1},\ldots ,g_{m})\ {\stackrel {\mathrm {def} }{=}}\ f,\quad {\text{ただし}}\quad f(x_{1},\ldots ,x_{k})=h(g_{1}(x_{1},\ldots ,x_{k}),\ldots ,g_{m}(x_{1},\ldots ,x_{k})).} のためにm = 1 {\displaystyle m=1} 通常の関数合成 h ∘ g 1 {\displaystyle h\circ g_{1}} 取得される。基本再帰演算子 ρ {\displaystyle \rho } k 項関数が与えられた場合g ( x 1 、 … 、 x k ) {\displaystyle g(x_{1},\ldots ,x_{k})\,} そして( k + 2 ) {\displaystyle (k+2)} -引数関数h ( y 、 z 、 x 1 、 … 、 x k ) {\displaystyle h(y,z,x_{1},\ldots ,x_{k})\,} : ρ ( g 、 h ) = d e f f 、 どこで ( k + 1 ) -引数関数 f 定義される f ( y 、 x 1 、 … 、 x k ) = { g ( x 1 、 … 、 x k ) もし y = 0 、 h ( y ′ 、 f ( y ′ 、 x 1 、 … 、 x k ) 、 x 1 、 … 、 x k ) もし y = S ( y ′ ) のために y ′ ∈ N 。 {\displaystyle {\begin{aligned}\rho (g,h)&\ {\stackrel {\mathrm {def} }{=}}\ f,\quad {\text{ここで、}}(k+1){\text{-項関数}}f{\text{は、}}\\f(y,x_{1},\dots ,x_{k})&={\begin{cases}g(x_{1},\dots ,x_{k})&{\text{if }}y=0,\\h(y',f(y',x_{1},\dots ,x_{k}),x_{1},\dots ,x_{k})&{\text{if }}y=S(y'){\text{ for a }}y'\in \mathbb {N} .\end{cases}}\end{aligned}}} 解釈:
機能f {\displaystyle f} forループ として機能します0 {\displaystyle 0} 最初の引数の値まで。残りの引数はf {\displaystyle f} 、ここではで表すx 1 、 … 、 x k {\displaystyle x_{1},\ldots ,x_{k}} 、は、forループの初期条件のセットであり、計算中に使用される可能性がありますが、forループによって変更されることはありません。g {\displaystyle g} そしてh {\displaystyle h} 定義する方程式の右辺f {\displaystyle f} ループの本体を表し、計算を実行します。g {\displaystyle g} は初期計算を実行するために一度だけ使用されます。ループの以降のステップの計算はによって実行されます。h {\displaystyle h} .最初のパラメータはh {\displaystyle h} forループのインデックスの「現在」の値が渡されます。2番目のパラメータはh {\displaystyle h} には、前のステップからの for ループの以前の計算結果が渡されます。残りのパラメータはh {\displaystyle h} これらは、前述の for ループの不変の初期条件です。これらは、h {\displaystyle h} 計算を実行するが、それ自体は変更されないh {\displaystyle h} 。原始的な再帰関数 とは、基本関数、および基本関数にこれらの操作を有限回適用することによって得られる関数のことである。
ベクトル値関数の原始的再帰性 (ベクトル値)関数[ 5 ] f : N m → N n {\displaystyle f:\mathbb {N} ^{m}\to \mathbb {N} ^{n}} プリミティブ再帰とは、次のように書ける場合を指します。
f ( x 1 、 … 、 x m ) = ( f 1 ( x 1 、 … 、 x m ) 、 … 、 f n ( x 1 、 … 、 x m ) ) {\displaystyle f(x_{1},\dots ,x_{m})=(f_{1}(x_{1},\dots ,x_{m}),\dots ,f_{n}(x_{1},\dots ,x_{m}))} 各コンポーネントf 私 : N m → N {\displaystyle f_{i}:\mathbb {N} ^{m}\to \mathbb {N} } は(スカラー値の)原始的な再帰関数です。[ 6 ]
例 C 0 1 {\displaystyle C_{0}^{1}} これは、1 項関数で、0 {\displaystyle 0} すべての入力に対して:C 0 1 ( x ) = 0 {\displaystyle C_{0}^{1}(x)=0} 。C 1 1 {\displaystyle C_{1}^{1}} これは、1 項関数で、1 {\displaystyle 1} すべての入力に対して:C 1 1 ( x ) = 1 {\displaystyle C_{1}^{1}(x)=1} 。C 3 0 {\displaystyle C_{3}^{0}} これは0項関数、つまり定数です。C 3 0 = 3 {\displaystyle C_{3}^{0}=3} 。P 1 1 {\displaystyle P_{1}^{1}} 自然数上の恒等関数は次のとおりです。P 1 1 ( x ) = x {\displaystyle P_{1}^{1}(x)=x} 。P 1 2 {\displaystyle P_{1}^{2}} そしてP 2 2 {\displaystyle P_{2}^{2}} はそれぞれ、自然数のペアに対する左射影と右射影である。P 1 2 ( x 、 y ) = x {\displaystyle P_{1}^{2}(x,y)=x} そしてP 2 2 ( x 、 y ) = y {\displaystyle P_{2}^{2}(x,y)=y} 。S ∘ S {\displaystyle S\circ S} これは入力に2を加える1項関数です。( S ∘ S ) ( x ) = x + 2 {\displaystyle (S\circ S)(x)=x+2} 。S ∘ C 0 1 {\displaystyle S\circ C_{0}^{1}} これは、入力値に関わらず1を返す1項関数です。( S ∘ C 0 1 ) ( x ) = S ( C 0 1 ( x ) ) = S ( 0 ) = 1 {\displaystyle (S\circ C_{0}^{1})(x)=S(C_{0}^{1}(x))=S(0)=1} つまり、S ∘ C 0 1 {\displaystyle S\circ C_{0}^{1}} そしてC 1 1 {\displaystyle C_{1}^{1}} 同じ機能です。S ∘ C 0 1 = C 1 1 {\displaystyle S\circ C_{0}^{1}=C_{1}^{1}} 同様に、C n k {\displaystyle C_{n}^{k}} 適切な数の合成として表現できるS {\displaystyle S} そしてC 0 k {\displaystyle C_{0}^{k}} 。 さらに、C 0 k {\displaystyle C_{0}^{k}} 等しいC 0 1 ∘ P 1 k {\displaystyle C_{0}^{1}\circ P_{1}^{k}} 、 以来C 0 k ( x 1 、 … 、 x k ) = 0 = C 0 1 ( x 1 ) = C 0 1 ( P 1 k ( x 1 、 … 、 x k ) ) = ( C 0 1 ∘ P 1 k ) ( x 1 、 … 、 x k ) {\displaystyle C_{0}^{k}(x_{1},\ldots ,x_{k})=0=C_{0}^{1}(x_{1})=C_{0}^{1}(P_{1}^{k}(x_{1},\ldots ,x_{k}))=(C_{0}^{1}\circ P_{1}^{k})(x_{1},\ldots ,x_{k})} これらの理由から、一部の著者[ 7 ] は次のように定義している。C n k {\displaystyle C_{n}^{k}} のみn = 0 {\displaystyle n=0} そしてk = 1 {\displaystyle k=1} 。
追加 2項関数の定義追加 {\displaystyle \operatorname {追加} } 引数の合計を計算するには、基本再帰演算子を使用して取得できます。ρ {\displaystyle \rho } この目的のために、よく知られた方程式
0 + y = y 、 S ( x ) + y = S ( x + y ) {\displaystyle {\begin{aligned}0+y&=y,\\S(x)+y&=S(x+y)\end{aligned}}} 「原始再帰関数用語で言い換えられる」: 定義においてρ ( g 、 h ) {\displaystyle \rho (g,h)} 最初の式は、選択することを示唆している。g = P 1 1 {\displaystyle g=P_{1}^{1}} 取得する追加 ( 0 、 y ) = g ( y ) = y {\displaystyle \operatorname {追加} (0,y)=g(y)=y} 2番目の式は選択することを示唆しているh = S ∘ P 2 3 {\displaystyle h=S\circ P_{2}^{3}} 取得する追加 ( S ( x ) 、 y ) = h ( x 、 追加 ( x 、 y ) 、 y ) = ( S ∘ P 2 3 ) ( x 、 追加 ( x 、 y ) 、 y ) = S ( 追加 ( x 、 y ) ) {\displaystyle \operatorname {Add} (S(x),y)=h(x,\operatorname {Add} (x,y),y)=(S\circ P_{2}^{3})(x,\operatorname {Add} (x,y),y)=S(\operatorname {Add} (x,y))} したがって、加算関数は次のように定義できます。追加 = ρ ( P 1 1 、 S ∘ P 2 3 ) {\displaystyle \operatorname {Add} =\rho (P_{1}^{1},S\circ P_{2}^{3})} 計算例として、
追加 ( 1 、 7 ) = ρ ( P 1 1 、 S ∘ P 2 3 ) ( S ( 0 ) 、 7 ) Def による。 追加 、 S = ( S ∘ P 2 3 ) ( 0 、 追加 ( 0 、 7 ) 、 7 ) ケースごとに ρ ( g 、 h ) ( S ( 。 。 。 ) 、 。 。 。 ) = S ( 追加 ( 0 、 7 ) ) Def による。 ∘ 、 P 2 3 = S ( ρ ( P 1 1 、 S ∘ P 2 3 ) ( 0 、 7 ) ) Def による。 追加 = S ( P 1 1 ( 7 ) ) ケースごとに ρ ( g 、 h ) ( 0 、 。 。 。 ) = S ( 7 ) Def による。 P 1 1 = 8 Def による。 S 。 {\displaystyle {\begin{aligned}\operatorname {Add} (1,7)&=\rho (P_{1}^{1},S\circ P_{2}^{3})(S(0),7)&&{\text{ by Def. }}\operatorname {Add} ,S\\&=(S\circ P_{2}^{3})(0,\operatorname {Add} (0,7),7)&&{\text{ by case }}\rho (g,h)(S(...),...)\\&=S(\operatorname {Add} (0,7))&&{\text{ by Def. }}\circ ,P_{2}^{3}\\&=S(\rho (P_{1}^{1},S\circ P_{2}^{3})(0,7))&&{\text{ by Def. }}\operatorname {Add} \\&=S(P_{1}^{1}(7))&&{\text{ by case }}\rho (g,h)(0,...)\\&=S(7)&&{\text{ by Def. }}P_{1}^{1}\\&=8&&{\text{ by Def. }}S.\\\end{aligned}}}
倍増 与えられた追加 {\displaystyle \operatorname {Add} } 1項関数追加 ∘ ( P 1 1 、 P 1 1 ) {\displaystyle \operatorname {Add} \circ (P_{1}^{1},P_{1}^{1})} その主張を倍増させる、( 追加 ∘ ( P 1 1 、 P 1 1 ) ) ( x ) = 追加 ( x 、 x ) = x + x 。 {\displaystyle (\operatorname {Add} \circ (P_{1}^{1},P_{1}^{1}))(x)=\operatorname {Add} (x,x)=x+x.}
乗算 足し算と同様に、掛け算は次のように定義できます。ムル = ρ ( C 0 1 、 追加 ∘ ( P 2 3 、 P 3 3 ) ) {\displaystyle \operatorname {Mul} =\rho (C_{0}^{1},\operatorname {Add} \circ (P_{2}^{3},P_{3}^{3}))} これは、よく知られている乗算の式を再現するものです。
ムル ( 0 、 y ) = ρ ( C 0 1 、 追加 ∘ ( P 2 3 、 P 3 3 ) ) ( 0 、 y ) Def による。 ムル = C 0 1 ( y ) ケースごとに ρ ( g 、 h ) ( 0 、 。 。 。 ) = 0 Def による。 C 0 1 。 {\displaystyle {\begin{aligned}\operatorname {Mul} (0,y)&=\rho (C_{0}^{1},\operatorname {Add} \circ (P_{2}^{3},P_{3}^{3}))(0,y)&&{\text{ by Def. }}\operatorname {Mul} \\&=C_{0}^{1}(y)&&{\text{ by case }}\rho (g,h)(0,...)\\&=0&&{\text{ by Def. }}C_{0}^{1}.\end{aligned}}} そして
ムル ( S ( x ) 、 y ) = ρ ( C 0 1 、 追加 ∘ ( P 2 3 、 P 3 3 ) ) ( S ( x ) 、 y ) Def による。 ムル = ( 追加 ∘ ( P 2 3 、 P 3 3 ) ) ( x 、 ムル ( x 、 y ) 、 y ) ケースごとに ρ ( g 、 h ) ( S ( 。 。 。 ) 、 。 。 。 ) = 追加 ( ムル ( x 、 y ) 、 y ) Def による。 ∘ 、 P 2 3 、 P 3 3 = ムル ( x 、 y ) + y 所有物 追加 。 {\displaystyle {\begin{aligned}\operatorname {Mul} (S(x),y)&=\rho (C_{0}^{1},\operatorname {Add} \circ (P_{2}^{3},P_{3}^{3}))(S(x),y)&&{\text{ by Def. }}\operatorname {Mul} \\&=(\operatorname {Add} \circ (P_{2}^{3},P_{3}^{3}))(x,\operatorname {Mul} (x,y),y)&&{\text{ by case }}\rho (g,h)(S(...),...)\\&=\operatorname {Add} (\operatorname {Mul} (x,y),y)&&{\text{ by Def. }}\circ ,P_{2}^{3},P_{3}^{3}\\&=\operatorname {Mul} (x,y)+y&&{\text{ by property of }}\operatorname {Add} .\end{aligned}}}
切り捨て減算 限定減算関数(「monus 」とも呼ばれ、「− ˙ {\displaystyle \mathbin {\dot {-}} } )は前任関数から定義可能です。それは以下の式を満たします。
y − ˙ 0 = y 、 y − ˙ S ( x ) = プレデター ( y − ˙ x ) 。 {\displaystyle {\begin{aligned}y\mathbin {\dot {-}} 0&=y,\\y\mathbin {\dot {-}} S(x)&=\operatorname {Pred} (y\mathbin {\dot {-}} x).\end{aligned}}} 再帰は2番目の引数に対して実行されるため、まず逆引き算の原始的な再帰的定義から始めます。RSub ( y 、 x ) = x − ˙ y {\displaystyle \operatorname {RSub} (y,x)=x\mathbin {\dot {-}} y} 。その再帰は最初の引数に対して実行されるため、加算と同様に、その原始的な再帰定義が得られます。RSub = ρ ( P 1 1 、 プレデター ∘ P 2 3 ) {\displaystyle \operatorname {RSub} =\rho (P_{1}^{1},\operatorname {Pred} \circ P_{2}^{3})} 逆順の引数を取り除くには、次のように定義します。サブ = RSub ∘ ( P 2 2 、 P 1 2 ) {\displaystyle \operatorname {Sub} =\operatorname {RSub} \circ (P_{2}^{2},P_{1}^{2})} 計算例として、
サブ ( 8 、 1 ) = ( RSub ∘ ( P 2 2 、 P 1 2 ) ) ( 8 、 1 ) Def による。 サブ = RSub ( 1 、 8 ) Def による。 ∘ 、 P 2 2 、 P 1 2 = ρ ( P 1 1 、 プレデター ∘ P 2 3 ) ( S ( 0 ) 、 8 ) Def による。 RSub 、 S = ( プレデター ∘ P 2 3 ) ( 0 、 RSub ( 0 、 8 ) 、 8 ) ケースごとに ρ ( g 、 h ) ( S ( 。 。 。 ) 、 。 。 。 ) = プレデター ( RSub ( 0 、 8 ) ) Def による。 ∘ 、 P 2 3 = プレデター ( ρ ( P 1 1 、 プレデター ∘ P 2 3 ) ( 0 、 8 ) ) Def による。 RSub = プレデター ( P 1 1 ( 8 ) ) ケースごとに ρ ( g 、 h ) ( 0 、 。 。 。 ) = プレデター ( 8 ) Def による。 P 1 1 = 7 所有物 プレデター 。 {\displaystyle {\begin{aligned}\operatorname {Sub} (8,1)&=(\operatorname {RSub} \circ (P_{2}^{2},P_{1}^{2}))(8,1)&&{\text{ by Def. }}\operatorname {Sub} \\&=\operatorname {RSub} (1,8)&&{\text{ by Def. }}\circ ,P_{2}^{2},P_{1}^{2}\\&=\rho (P_{1}^{1},\operatorname {Pred} \circ P_{2}^{3})(S(0),8)&&{\text{ by Def. }}\operatorname {RSub} ,S\\&=(\operatorname {Pred} \circ P_{2}^{3})(0,\operatorname {RSub} (0,8),8)&&{\text{ by case }}\rho (g,h)(S(...),...)\\&=\operatorname {Pred} (\operatorname {RSub} (0,8))&&{\text{ by Def. }}\circ ,P_{2}^{3}\\&=\operatorname {Pred} (\rho (P_{1}^{1},\operatorname {Pred} \circ P_{2}^{3})(0,8))&&{\text{ by Def. }}\operatorname {RSub} \\&=\operatorname {Pred} (P_{1}^{1}(8))&&{\text{ by case }}\rho (g,h)(0,...)\\&=\operatorname {Pred} (8)&&{\text{ by Def. }}P_{1}^{1}\\&=7&&{\text{ by property of }}\operatorname {Pred} .\end{aligned}}}
もし~ならば、そうでなければ プログラミング言語でおなじみの3項if-then-else演算子は次のように定義できます。もし = ρ ( P 2 2 、 P 3 4 ) {\displaystyle \operatorname {If} =\rho (P_{2}^{2},P_{3}^{4})} 。次に、任意のx {\displaystyle x} 、
もし ( S ( x ) 、 y 、 z ) = ρ ( P 2 2 、 P 3 4 ) ( S ( x ) 、 y 、 z ) Def による。 もし = P 3 4 ( x 、 もし ( x 、 y 、 z ) 、 y 、 z ) ケースごとに ρ ( S ( 。 。 。 ) 、 。 。 。 ) = y Def による。 P 3 4 {\displaystyle {\begin{aligned}\operatorname {If} (S(x),y,z)&=\rho (P_{2}^{2},P_{3}^{4})(S(x),y,z)&&{\text{ by Def. }}\operatorname {If} \\&=P_{3}^{4}(x,\operatorname {If} (x,y,z),y,z)&&{\text{ by case }}\rho (S(...),...)\\&=y&&{\text{ by Def. }}P_{3}^{4}\end{aligned}}} そして
もし ( 0 、 y 、 z ) = ρ ( P 2 2 、 P 3 4 ) ( 0 、 y 、 z ) Def による。 もし = P 2 2 ( y 、 z ) ケースごとに ρ ( 0 、 。 。 。 ) = z Def による。 P 2 2 。 {\displaystyle {\begin{aligned}\operatorname {If} (0,y,z)&=\rho (P_{2}^{2},P_{3}^{4})(0,y,z)&&{\text{ by Def. }}\operatorname {If} \\&=P_{2}^{2}(y,z)&&{\text{ by case }}\rho (0,...)\\&=z&&{\text{ by Def. }}P_{2}^{2}.\end{aligned}}} つまり、もし ( x 、 y 、 z ) {\displaystyle \operatorname {If} (x,y,z)} then 部分を返します (y {\displaystyle y} ) if 部分 (x {\displaystyle x} ) は真であり、else 部分 (z {\displaystyle z} ) さもないと。
ジャンクター に基づくともし {\displaystyle \operatorname {If} } 関数では、論理ジャンクタを簡単に定義できます。たとえば、定義するとそして = もし ∘ ( P 1 2 、 P 2 2 、 C 0 2 ) {\displaystyle \operatorname {And} =\operatorname {If} \circ (P_{1}^{2},P_{2}^{2},C_{0}^{2})} すると、そして ( x 、 y ) = もし ( x 、 y 、 0 ) {\displaystyle \operatorname {And} (x,y)=\operatorname {If} (x,y,0)} つまり、そして ( x 、 y ) {\displaystyle \operatorname {And} (x,y)} は、両方が真である場合に限り 真である。x {\displaystyle x} そしてy {\displaystyle y} 真である(論理 積x {\displaystyle x} そしてy {\displaystyle y} )
同様に、または = もし ∘ ( P 1 2 、 C 1 2 、 P 2 2 ) {\displaystyle \operatorname {Or} =\operatorname {If} \circ (P_{1}^{2},C_{1}^{2},P_{2}^{2})} そしてない = もし ∘ ( P 1 1 、 C 0 1 、 C 1 1 ) {\displaystyle \operatorname {Not} =\operatorname {If} \circ (P_{1}^{1},C_{0}^{1},C_{1}^{1})} 論理和 と否定 の適切な定義につながる:または ( x 、 y ) = もし ( x 、 1 、 y ) {\displaystyle \operatorname {Or} (x,y)=\operatorname {If} (x,1,y)} そしてない ( x ) = もし ( x 、 0 、 1 ) {\displaystyle \operatorname {Not} (x)=\operatorname {If} (x,0,1)} 。
整数と有理数の演算 ゲーデル数を 用いることで、原始再帰関数を拡張し、整数や有理数 などの他の対象にも適用できるようになります。整数を標準的な方法でゲーデル数で符号化すれば、加算、減算、乗算などの算術演算はすべて原始再帰的になります。同様に、有理数をゲーデル数で表現すれば、体 演算はすべて原始再帰的になります。
一般的な基本的な再帰関数 以下の例と定義は、Kleene 1974 、pp. 222–231 からのものです。多くは証明付きで掲載されています。また、ほとんどはBoolos、Burgess & Jeffrey 2002 、pp. 63–70 にも同様の名称で掲載されており、証明または例として挙げられています。正確な導出に応じて、対数 lo(x, y) または lg(x, y) が追加されています。
以下では、記号「'」、例えば a' は、「~の後継者」を意味する原始記号であり、通常は「+1」、例えば a +1 = def a' と解釈されます。関数 16〜20 および #G は、原始再帰述語を ゲーデル数 として表現された「算術的」形式に変換したり、そこから抽出したりすることに関して特に興味深いものです。
加算:a+b 乗算: a×b 指数計算: a b 階乗 a! : 0! = 1、a'! = a!×a' pred(a): (前任者または減少): a > 0 の場合、a−1、それ以外の場合は 0 適切な減算 a ∸ b: a ≥ b ならば a−b、そうでなければ 0 最小値(a 1 , ... a n ) 最大値(a 1 , ... a n ) 絶対差: | a−b | = def (a ∸ b) + (b ∸ a) ~sg(a): NOT[signum(a)]: a=0 の場合 1、それ以外の場合 0 sg(a): signum(a): a=0 の場合 0、それ以外の場合 1 a | b: (a が b を割り切る): ある k に対して b = k × a ならば 0、そうでなければ 1 剰余(a, b): bがaを割り切れない場合の余り。MOD(a, b)とも呼ばれる。 a = b: sg | a − b | (クリーネの慣例では、真 を0、偽を1で表していましたが、現在では、特にコンピュータにおいては、その逆、つまり 真を1、 偽 を0で表すのが最も一般的な慣例となっています。これは、ここでおよび次の項目でsgを~sgに変更することに相当します。) a < b: sg( a' ∸ b ) Pr(a): a は素数である Pr(a) = def a>1 & NOT(Exists c) 1<c<a [ c|a ] p i : i+1番目の素数 (a) i : p i の指数a: p i x |a かつ NOT(p i x' |a)となる一意の x lh(a): 非零指数の「長さ」または数 lo(a, b): (a の底を b とする対数): a, b > 1 の場合、b x | aとなる最大の x 、それ以外の場合は 0以下では、略語x = def x 1 , ... x n ; 意味上必要な場合は添え字が使用されることがあります。 #A: 関数 Ψ と定数 q 1 、 ... q n から明示的に定義できる関数 φ は、Ψ において原始再帰的である。#B: 有限和 Σ y<z ψ( x , y) と積 Π y<z ψ( x , y) は ψ において原始再帰的です。 #C:述語 Q の各変数に関数 χ 1 ,..., χ m を代入して得られる述語P は、χ 1 ,..., χ m , Qに関して原始再帰的である。 #D: 以下の述語は 、Q および R において原始再帰的です。 NOT_Q( x ) 。 QまたはR:Q( x )VR( x )、 QとR: Q( x ) & R( x )、 Q は R を意味する: Q( x ) → R( x ) QはRと同等である:Q( x )≡R( x ) #E: 次の述語は、 述語 Rにおいて原始再帰的です。 (Ey) y<z R( x , y) ここで (Ey) y<z は「z より小さい y が少なくとも 1 つ存在して、次のようになる」という意味です。 (y) y<z R( x , y) ここで (y) y<z は「z より小さいすべての y に対して、次のことが成り立つ」という意味です。 μy y<z R( x , y)。演算子 μy y<z R( x , y) は、いわゆる最小化演算子またはミュー演算子の 有界形式です。定義は「R( x , y) が真となるような、z より小さい y の最小値。そのような値が存在しない場合は z 」です。 #F: 場合分けによる定義: Q 1 、 ...、 Q m が相互に排他的な述語 (または "ψ( x ) は適用される最初の節によって与えられた値を持つ) であるように定義された関数は、φ 1 、 ...、 Q 1 、 ... Q m に関して原始再帰的である。 φ( x ) = φ 1 ( x ) Q 1 ( x ) が真の場合、 . . . . . . . . . . . . . . . . . . . Q m ( x ) が真の場合、 φ m ( x ) とします。 φ m+1 ( x ) それ以外の場合 φ(y, x ) = χ(y, COURSE-φ(y; x 2 , ... x n ), x 2 , ... x n ) の場合、φ は χ において原始再帰的である。コースオブバリュー関数の値 COURSE-φ(y; x 2 to n ) は、元の関数の値のシーケンス φ(0, x 2 to n ), ..., φ(y-1, x 2 to n ) をエンコードする。
再帰関数との関係 より広いクラスである部分再帰関数は、 無制限探索演算子 を導入することによって定義されます。この演算子を使用すると、部分関数 、つまり各引数に対して最大で 1 つの値を持つ関係が得られますが、一部の引数では値を持たない場合があります ( ドメインを参照)。同等の定義として、部分再帰関数は チューリングマシン で計算できる関数であると述べられています。完全再帰関数は、すべての入力に対して定義される部分再帰関数です。
すべての原始再帰関数は全再帰関数ですが、すべての全再帰関数が原始再帰関数であるとは限りません。アッカーマン関数 A ( m , n ) は、全再帰関数 (実際には証明可能な全再帰関数) でありながら原始再帰関数ではない、よく知られた例です。アッカーマン関数を用いて、原始再帰関数を全再帰関数の部分集合として特徴づけることができます。この特徴づけによれば、関数が原始再帰関数であるのは、 自然数m が存在し、その関数が、常にA( m , n ) 以下のステップで停止する チューリングマシンによって計算できる場合に限ります。ここで、 n は原始再帰関数の引数の合計です。[ 9 ]
原始再帰関数の重要な特性は、それらが全再帰関数 の集合(それ自体は再帰的に列挙可能ではない)の再帰的に列挙可能な 部分集合であるということです。これは、原始再帰関数を列挙する単一の再帰関数f ( m , n ) が存在することを意味します。すなわち、次のようになります。
f は 、原始再帰関数を作成するすべての可能な方法を繰り返し実行することによって明示的に構成できます。したがって、f は全関数であることが証明できます。対角線論法を使用して、 f がそれ自体再帰的原始関数ではないことを示すことができます。もしそうであれば、 h ( n ) = f ( n , n )+1 も再帰的原始関数になります。しかし、これが何らかの原始再帰関数に等しい場合、すべてのnに対して h ( n ) = f ( m , n )となるm が存在し、h ( m ) = f ( m , m ) となり、矛盾が生じます。
しかし、原始再帰関数の集合は、全再帰関数の集合の中で最大の 再帰的に列挙可能な部分集合ではありません。例えば、(ペアノ算術における)証明可能な全関数の集合も再帰的に列挙可能です。なぜなら、その理論のすべての証明を列挙できるからです。すべての原始再帰関数は証明可能な全関数ですが、その逆は真ではありません。
制限事項 原始再帰関数は、計算可能な関数がどのようなものであるべきかという私たちの直感と非常に密接に対応しています。確かに、初期関数は(その単純さゆえに)直感的に計算可能であり、新しい原始再帰関数を作成する2つの操作も非常に単純です。しかし、原始再帰関数の集合には、考えられるすべての全計算可能関数が含まれているわけではありません。これは、カントールの対角線論法 の変形によって確認できます。この論法は、原始再帰的ではない全計算可能関数を提供します。証明の概略は次のとおりです。
1 つの引数を持つ原始再帰関数 (つまり、単項関数) は
計算可能列挙 できます。この列挙では、原始再帰関数の定義 (本質的には、合成と原始再帰操作を演算子として、基本的な原始再帰関数を原子とする式) を使用し、同じ
関数 がリストに何度も出現する場合でも、すべての定義が一度ずつ含まれていると想定できます (多くの定義が同じ関数を定義しているため。実際、
恒等関数 による合成だけで、任意の 1 つの原始再帰関数の定義が無限に生成されます)。これは、
n {\displaystyle n} この列挙における原始再帰関数の 番目の定義は、
n {\displaystyle n} 実際、定義を数値として符号化するために
ゲーデル数を 用いると、
n {\displaystyle n} リスト内の 番目の定義は、原始的な再帰関数によって計算されます。
n {\displaystyle n} 。 させて
f n {\displaystyle f_{n}} この定義によって与えられる単項原始再帰関数を表す。
次に、「評価関数」を定義します。e v {\displaystyle ev} 2 つの引数で、e v ( 私 、 j ) = f 私 ( j ) {\displaystyle ev(i,j)=f_{i}(j)} 。 明らかにe v {\displaystyle ev} は、定義を効果的に決定できるため、全体的かつ計算可能です。f 私 {\displaystyle f_{i}} 原始的な再帰関数であるf 私 {\displaystyle f_{i}} それ自体が完全かつ計算可能であるためf 私 ( j ) {\displaystyle f_{i}(j)} は常に定義され、効果的に計算可能です。ただし、対角引数は関数がe v {\displaystyle ev} 2 つの引数は原始的な再帰ではありません。
仮定する
e v {\displaystyle ev} 原始再帰的であった場合、単項関数
g {\displaystyle g} 定義される
g ( 私 ) = S ( e v ( 私 、 私 ) ) {\displaystyle g(i)=S(ev(i,i))} 後継関数からの合成によって定義されるため、プリミティブ再帰にもなります。
e v {\displaystyle ev} しかしその後
g {\displaystyle g} 列挙で発生するので、数があります
n {\displaystyle n} そのため
g = f n {\displaystyle g=f_{n}} しかし今は
g ( n ) = S ( e v ( n 、 n ) ) = S ( f n ( n ) ) = S ( g ( n ) ) {\displaystyle g(n)=S(ev(n,n))=S(f_{n}(n))=S(g(n))} 矛盾が生じる。
この議論は、「常に停止する機械」 の記事で説明されているように、このように列挙できる計算可能な(全体)関数のあらゆるクラスに適用できます。ただし、部分的な 計算可能な関数(すべての引数に対して定義する必要がない関数)は、例えばチューリングマシンの符号化を列挙することによって明示的に列挙できることに注意してください。
完全再帰関数ではあるが原始再帰関数ではない他の例も知られている。
バリエーション
定数関数 の代わりにC n k {\displaystyle C_{n}^{k}} 代替定義では、0 値ゼロ関数を 1 つだけ使用します。 C 0 0 {\displaystyle C_{0}^{0}} 常にゼロを返す基本関数として、ゼロ関数、後継関数、および合成演算子から定数関数を構築します。
反復関数 ロビンソン、再帰規則のさまざまな制約を検討した。その1つは、関数hが パラメータx i にアクセスできないいわゆる反復規則 である(この場合、一般性を失うことなく、関数g は恒等関数であると仮定できる。なぜなら、一般の場合は代入によって得られるからである)。
f ( 0 、 x ) = x 、 f ( S ( y ) 、 x ) = h ( y 、 f ( y 、 x ) ) 。 {\displaystyle {\begin{aligned}f(0,x)&=x,\\f(S(y),x)&=h(y,f(y,x)).\end{aligned}}} 彼は、すべての原始的な再帰関数のクラスが、この方法で依然として得られることを証明した。
純粋再帰 Robinson が考慮したもう 1 つの制約は、純粋な再帰 であり、h は 誘導変数y にアクセスできません。
f ( 0 、 x 1 、 … 、 x k ) = g ( x 1 、 … 、 x k ) 、 f ( S ( y ) 、 x 1 、 … 、 x k ) = h ( f ( y 、 x 1 、 … 、 x k ) 、 x 1 、 … 、 x k ) 。 {\displaystyle {\begin{aligned}f(0,x_{1},\ldots ,x_{k})&=g(x_{1},\ldots ,x_{k}),\\f(S(y),x_{1},\ldots ,x_{k})&=h(f(y,x_{1},\ldots ,x_{k}),x_{1},\ldots ,x_{k}).\end{aligned}}} グラッドストーンは、この規則で全ての原始的な再帰関数を生成できることを証明した。グラッドストーンはこれを改良し、以下の2つの制約の組み合わせ、すなわち純粋な反復 規則だけでも十分であることを証明した。
f ( 0 、 x ) = x 、 f ( S ( y ) 、 x ) = h ( f ( y 、 x ) ) 。 {\displaystyle {\begin{aligned}f(0,x)&=x,\\f(S(y),x)&=h(f(y,x)).\end{aligned}}} さらなる改善が可能: セヴェリンは、パラメータのない 純粋な反復規則、すなわち
f ( 0 ) = 0 、 f ( S ( y ) ) = h ( f ( y ) ) 、 {\displaystyle {\begin{aligned}f(0)&=0,\\f(S(y))&=h(f(y)),\end{aligned}}} 初期関数のセットを切り捨て減算x ∸ yで拡張すれば、すべての 単項 原始再帰関数を生成するのに十分です。さらに初期関数として + を含めると、すべての原始再帰関数が得られます。
再帰のいくつかの形式は、実際には原始的な再帰関数を定義することもあります。これらの形式で定義すると、見つけやすくなったり、読み書きがより自然になったりする場合があります。値系列再帰は、原始的な再帰関数を定義します。 相互再帰 のいくつかの形式も、原始的な再帰関数を定義します。
LOOPプログラミング言語 でプログラムできる関数は、まさに基本的な再帰関数です。これは、これらの関数の能力を異なる視点から捉えることを意味します。チューリング完全な言語 と比較した場合、LOOP言語の主な制約は、各ループの実行回数がループ開始前に指定される点にあります。