構造帰納法 は、数理論理学(例えば、 Łośの定理 の証明)、コンピュータ科学 、グラフ理論 、およびその他のいくつかの数学分野で用いられる証明手法です。これは 自然数に関する数学的帰納法の一般化であり、さらに任意の ネーター帰納法 へと一般化することができます。 構造再帰は、通常の再帰が通常の 数学的帰納法 に対して持つ関係と同じ関係を構造帰納法に対して持つ再帰 手法です。
構造帰納法は、式 、リスト 、木などの 再帰的に定義された 構造 のすべてのx に対して、ある命題 P ( x ) が成り立つことを証明するために用いられます。構造上に整礎 半順序 が定義されます(式の場合は「部分式」、リストの場合は「部分リスト」、木の場合は「部分木」)。構造帰納法による証明は、命題がすべての最小 構造に対して成り立ち、かつ、ある構造 Sの直下の部分構造に対して成り立つならば、 S に対しても成り立つこと を証明するものです。(厳密に言えば、これは整礎帰納法 の公理の前提を満たします。この公理は、これらの 2 つの条件が命題がすべてのx に対して成り立つための十分条件であると主張しています。)
構造的再帰関数は、再帰関数を定義する際に同じ考え方を用います。「基本ケース」は、それぞれの最小構造と再帰のルールを処理します。構造的再帰は通常、構造的帰納法によって正当性が証明されます。特に簡単なケースでは、帰納的ステップが省略されることがよくあります。以下の例にあるlength 関数と ++ 関数は、構造的に再帰的な関数です。
例えば、構造がリストである場合、通常は部分順序「<」を導入します。これは、リストLがリスト M の末尾である場合にL < M となるものです。この順序付けの下では、空リスト[] が唯一の最小要素となります。ある命題P ( L ) の構造的帰納法による証明は、次の 2 つの部分から構成されます。P ( []) が 真であることの証明と、あるリストLに対して P ( L ) が真であり、かつL がリスト M の末尾である場合、P ( M ) も真でなければならないことの証明です。
最終的には、関数や構造がどのように構築されたかによって、複数の基本ケースや複数の帰納ケースが存在する可能性があります。そのような場合、ある命題P ( L ) の構造的帰納証明は、次のようになります。
各基本ケースBCに対して P ( BC ) が真であることの証明、 あるインスタンスIに対して P ( I ) が真であり、M が I から任意の再帰規則を 1 回適用することによって得られる場合、 P ( M ) も真でなければならないという証明。
例 古代の祖先系統図。5世代にわたる31人が示されている。 祖先ツリー は、ある人物の両親、祖父母などを既知の範囲で示す、よく知られたデータ構造です(例については図を参照)。これは再帰的に定義されます。
最も単純なケースでは、祖先系統図には1人の人物のみが表示されます(両親について何も分かっていない場合)。 あるいは、祖先ツリーは、1人の人物と、枝でつながれたその人物の両親の2つの祖先サブツリーを示します(証明を簡潔にするために、どちらか一方が分かっている場合は両方とも分かっているという単純化された仮定を使用します)。 例えば、「g 世代にわたる祖先系統樹には、最大で2g -1人の人物しか含まれない」という性質は、 構造帰納法によって次のように証明できます。
最も単純なケースでは、ツリーは1人の人物、つまり1世代のみを示します。1 ≤ 2 1 − 1 であるため、この性質はそのようなツリーに対して真です。 あるいは、このツリーは一人の人物とその両親のツリーを示しています。後者はそれぞれツリー全体のサブ構造であるため、証明すべき性質(帰納法の仮説 とも呼ばれる)を満たすと仮定できます。つまり、p ≤ 2 g − 1 およびq ≤ 2 h − 1 と仮定できます。ここで、 g とh は それぞれ父親と母親のサブツリーが及ぶ世代数を表し、p とq は それらが示す人物の数を表します。 g ≤ h の場合、ツリー全体は1 + h 世代にわたって広がり、p + q + 1 人の人物を示します。p + q + 1 ≤ ( 2 g − 1 ) + ( 2 h − 1 ) + 1 ≤ 2 h + 2 h − 1 = 2 1 + h − 1 、 {\displaystyle p+q+1\leq (2^{g}-1)+(2^{h}-1)+1\leq 2^{h}+2^{h}-1=2^{1+h}-1,} つまり、木全体がその性質を満たす。h ≤ g の場合、ツリー全体は1 + g 世代にわたって広がり、同様の推論によりp + q + 1 ≤ 2 g + 1 − 1 人であることが示され、つまりこの場合もツリー全体がその性質を満たします。 したがって、構造的帰納法により、各祖先木はこの性質を満たす。
より正式な例として、リストの次の性質を考えてみましょう 。
EQ: レン ( L + + M ) = レン ( L ) + レン ( M ) {\displaystyle {\text{EQ:}}\quad \operatorname {len} (L+\!+\ M)=\operatorname {len} (L)+\operatorname {len} (M)} ここで、++ は リスト連結操作、len() は リストの長さ、L とM はリストを表します。
これを証明するには、長さと連結演算の定義が必要です。( h : t ) を、先頭要素がh 、末尾要素がt であるリストとし、[] を空リストとします。長さと連結演算の定義は次のとおりです。
LEN1: レン ( [ ] ) = 0 LEN2: レン ( h : t ) = 1 + レン ( t ) アプリ1: [ ] + + l 私 s t = l 私 s t アプリ2: ( h : t ) + + l 私 s t = h : ( t + + l 私 s t ) {\displaystyle {\begin{array}{ll}{\text{LEN1:}}&\operatorname {len} ([\ ])=0\\{\text{LEN2:}}&\operatorname {len} (h:t)=1+\operatorname {len} (t)\\&\\{\text{APP1:}}&[\ ]+\!+\ list=list\\{\text{APP2:}}&(h:t)+\!+\ list=h:(t+\!+\ list)\end{array}}} 我々の命題P ( l )は、 L が l であるとき、すべてのリストMに対して EQ が 真であるというものである。我々は、 P ( l ) が すべてのリストl に対して真であることを示したい。我々は、リストに関する構造的帰納法を用いてこれを証明する。
まず、 P ([]) が真であることを証明します。つまり、L が空リスト [] である場合、すべてのリストMに対して EQ が真であることを証明します。EQを 考えてみましょう。
レン ( L + + M ) = レン ( [ ] + + M ) = レン ( M ) ( APP1による ) = 0 + レン ( M ) = レン ( [ ] ) + レン ( M ) ( LEN1による ) = レン ( L ) + レン ( M ) {\displaystyle {\begin{array}{rll}\operatorname {len} (L+\!+\ M)&=\operatorname {len} ([\ ]+\!+\ M)\\&=\operatorname {len} (M)&({\text{by APP1}})\\&=0+\operatorname {len} (M)\\&=\operatorname {len} ([\ ])+\オペレーター名 {len} (M)&({\text{by LEN1}})\\&=\オペレーター名 {len} (L)+\オペレーター名 {len} (M)\\\end{配列}}} したがって、定理のこの部分は証明されます。左辺と右辺が等しいので、 L が[] の場合、すべてのM に対してEQが真になります。
次に、任意の空でないリストIを考えます。I は 空ではないので、先頭項目x と末尾リストxsを持ち、 ( x : xs ) と表現できます。帰納法の仮説は、L がxs の場合、 M のすべての値に対してEQ が 真であるということです。
HYP: レン ( x s + + M ) = レン ( x s ) + レン ( M ) {\displaystyle {\text{HYP:}}\quad \operatorname {len} (xs+\!+\ M)=\operatorname {len} (xs)+\operatorname {len} (M)} これが正しい場合、 L = I = ( x : xs ) のとき、 EQ は M のすべての値に対しても真であることを示したい。これまでと同様に進めていく。
レン ( L ) + レン ( M ) = レン ( x : x s ) + レン ( M ) = 1 + レン ( x s ) + レン ( M ) ( LEN2による ) = 1 + レン ( x s + + M ) ( HYPによる ) = レン ( x : ( x s + + M ) ) ( LEN2による ) = レン ( ( x : x s ) + + M ) ( APP2による ) = レン ( L + + M ) {\displaystyle {\begin{array}{rll}\operatorname {len} (L)+\operatorname {len} (M)&=\operatorname {len} (x:xs)+\operatorname {len} (M)\\&=1+\operatorname {len} (xs)+\operatorname {len} (M)&({\text{by LEN2}})\\&=1+\operatorname {len} (xs+\!+\ M)&({\text{by HYP}})\\&=\operatorname {len} (x:(xs+\!+\ M))&({\text{by LEN2}})\\&=\operatorname {len} ((x:xs)+\!+\ M)&({\text{by APP2}})\\&=\operatorname {len} (L+\!+\ M)\end{array}}} したがって、構造的帰納法から、 P ( L ) はすべてのリストL に対して真であることがわかります。
整列 標準的な数学的帰納法が 整列原理 と等価であるのと同様に、構造的帰納法も整列原理と等価である。ある種類のすべての構造の集合が整礎半順序を許容する場合、空でない部分集合はすべて最小要素を持つ。(これが「整礎 」の定義である。)この文脈における補題の意義は、証明したい定理に反例が存在する場合、最小反例が存在することを推論できる点にある。最小反例の存在がさらに小さな反例を意味することを示せれば、矛盾が生じる(最小反例は最小ではないため)ので、反例の集合は空でなければならない。
この種の議論の例として、すべての二分木 の集合を考えてみましょう。完全な二分木の葉の数は、内部ノードの数より 1 つ多いことを示します。反例が存在すると仮定すると、内部ノードの数が最小の反例が存在するはずです。この反例C は、 n 個 の内部ノードとl 個の葉を持ち、n + 1 ≠ l です。さらに、自明な木はn = 0 かつl = 1 であるため反例ではないので、C は自明でないはずです。したがって、 C には、親ノードが内部ノードである葉が少なくとも 1 つあります。この葉とその親を木から削除し、葉の兄弟ノードを親が以前占めていた位置に昇格させます。これにより、n とl の 両方が1 ずつ減少するため、新しい木もn + 1 ≠ l となり、より小さな反例となります。しかし、仮定により、C は すでに最小の反例でした。したがって、そもそも反例が存在するという仮定は誤りだったはずです。ここで「小さい」が意味する部分順序は、 Sが T よりノード数が少ない場合に S < T となるというものです。
参考文献 ホップクロフト、ジョン・E.、ラジーブ・モトワニ、ジェフリー・D・ウルマン(2001)。オートマタ理論、言語、計算入門 (第2 版)。マサチューセッツ州リーディング:アディソン・ウェスリー。ISBN 978-0-201-44124-6 。 YouTube の 「数理論理学 - 動画 01.08 - 一般化(構造的)帰納法」 構造誘導に関する初期の出版物には以下のようなものがある。
Burstall, RM (1969). "構造的帰納法によるプログラムの特性の証明". The Computer Journal . 12 (1): 41–48 . doi : 10.1093/comjnl/12.1.41 . Aubin, Raymond (1976), Mechanizing Structural Induction , EDI-INF-PHD, vol. 76–002 , University of Edinburgh, hdl : 1842/6649 Huet, G.; Hullot, JM (1980). "構成子を持つ等式理論における帰納法による証明" (PDF) .第21回コンピュータサイエンス基礎に関する年次シンポジウム . IEEE. pp. 96–107 . Rózsa Péter 、Über die Verallgemeinerung der Theorie der rekursiven Funktionen für abstrakte Mengen geeigneter Struktur als Definitionsbereiche 、Symposium International、Varsovie 9 月 (1959 年) (ドメインとして適切な構造を持つ抽象量の再帰関数理論の一般化について ) 。