
数学やコンピュータサイエンスでは、再帰的定義、または帰納的定義は、集合内の要素を集合内の他の要素を用いて定義するために使用されます( Aczel 1977:740ff)。再帰的に定義可能なオブジェクトの例としては、階乗、自然数、フィボナッチ数列、カントール三項集合などがあります。
関数の再帰的定義は、ある入力に対する関数の値を、他の(通常はより小さい)入力に対する同じ関数の値を用いて定義します。たとえば、階乗関数n !は次の規則で定義されます。
この定義は、すべての自然数nに対して有効です。なぜなら、再帰処理は最終的に基本ケースである 0 に到達するからです。この定義は、 n = 0から始めてn = 1、2、3などと順に関数n ! の値を計算する手順を示すものと考えることもできます。
再帰定理は、そのような定義が確かに一意の関数を定義することを述べている。証明には数学的帰納法が用いられる。[ 1 ]
集合の帰納的定義は、集合内の要素を集合内の他の要素を用いて記述する。例えば、集合の定義の一つは、自然数のは:
(1)と(2)を満たす集合は多数存在する。例えば、集合{0, 1, 1.649, 2, 2.649, 3, 3.649, …}は定義を満たす。しかし、条件(3)は、余分な要素を含む集合を除外することで、自然数の集合を指定する。
再帰的に定義された関数や集合の性質は、再帰的定義に従う帰納法の原理によって証明できる場合が多い。例えば、ここで提示する自然数の定義は、自然数に関する数学的帰納法の原理を直接的に示唆している。すなわち、ある性質が自然数 0 (または 1) で成り立ち、その性質がnで成り立つときはいつでもn + 1でも成り立つならば、その性質はすべての自然数で成り立つ(Aczel 1977:742)。
ほとんどの再帰的定義は、基本ケース(基礎)と帰納節という2つの基盤から成り立っています。
循環定義と再帰定義の違いは、再帰定義には必ず基本ケース(定義自体では定義されていないが定義を満たすケース)が存在し、帰納節の他のすべてのインスタンスは、何らかの意味で「小さい」(つまり、再帰を終了させる基本ケースに近い)必要があるという点である。これは「より単純なケースでのみ再帰する」という規則としても知られている。[ 2 ]
対照的に、循環定義には基本ケースが存在しない場合があり、関数の値を他の値ではなく、その値自体によって定義してしまうことさえあります。このような状況は無限後退につながります。
再帰的定義が有効であること、つまり再帰的定義が一意の関数を特定することは、集合論の再帰定理として知られる定理であり、その証明は自明ではない。[ 3 ]関数の定義域が自然数である場合、定義が有効であるための十分条件は、f (0)の値(つまり基本ケース)が与えられ、n > 0の場合、 nに関してf ( n )を決定するアルゴリズムが与えられていることである。(つまり、帰納的節)
より一般的には、定義域が整列集合である場合は、超限再帰の原理を用いて関数の再帰的定義を行うことができる。有効な再帰的定義を構成する形式的な基準は、一般的な場合の方が複雑である。一般的な証明と基準の概要は、James MunkresのTopologyに記載されている。ただし、一般的な再帰的定義の特定の場合 (定義域が任意の整列集合ではなく正の整数に限定されている場合) については、以下に示す。[ 4 ]
A を集合とし、a 0 をAの要素とする。ρが、正の整数の空でない部分をAに写像する各関数fにAの要素を割り当てる関数である場合、一意の関数が存在する。そのため
加算は、数えることに基づいて再帰的に定義されます。
乗算は再帰的に次のように定義される。
指数関数は次のように再帰的に定義される。
二項係数は次のように再帰的に定義できます。
素数の集合は、以下の条件を満たす正の整数の唯一の集合として定義できる。
整数 2 の素数性は基本ケースです。この定義によって、2 より大きい任意の整数Xの素数性を確認するには、2 からXまでのすべての整数の素数性を知る必要がありますが、これはこの定義によって明確に定義されています。最後の点はXに関する帰納法によって証明できますが、そのためには第 2 節が「~の場合に限る」と書かれていることが不可欠です。もし単に「~の場合」と書かれていたら、例えば数 4 の素数性は明確ではなく、第 2 節をさらに適用することは不可能になります。
偶数は、
命題論理における整式(wff)の概念は、以下の3つの規則を満たす最小の集合として再帰的に定義される。
この定義は、特定の記号列がwffであるかどうかを判断するために使用できます。
論理プログラムは、再帰的定義の集合として理解できます 。[ 5 ] [ 6 ]例えば、偶数の再帰的定義は、次の論理プログラムとして記述できます。
even ( 0 ). even ( s ( s ( X ))) :- even ( X ).ここでは の場合:-を表し、は の後継者、すなわち、ペアノ算術におけるを表します。s(X)XX+1
論理プログラミング言語Prolog は、目標を解決し、クエリに答えるために逆推論を使用します。たとえば、クエリが与えられると、答えが生成されます。クエリが与えられると、答えが生成されます。?-even(s(s(0)))true?-even(s(0))false
このプログラムは、クエリが真であるかどうかを確認するだけでなく、真となる回答を生成するためにも使用できます。例えば、次のようになります。
?- even ( X ). X = 0 X = s ( s ( 0 )) X = s ( s ( s ( s ( 0 )))) X = s ( s ( s ( s ( s ( s ( 0 )))))) .....論理プログラムは、否定条件の使用を含めることで再帰的な定義を大幅に拡張します。否定条件は、定義のように、失敗として否定することで実装されます。
even ( 0 ). even ( s ( X )) :- not ( even ( X )).