コンピュータサイエンスにおいて、共帰納法とは、並行して相互作用するオブジェクトのシステムの特性を定義し証明するための手法である。
共帰納法は、構造帰納法の数学的な双対です。共帰納法によって定義されたデータ型は共データと呼ばれ、通常はストリームなどの無限データ構造です。
定義または仕様として、共帰納法は、ある対象がどのように「観察」され、「分解」され、あるいは「破壊」されてより単純な対象になるかを記述する。証明手法としては、そのような仕様のあらゆる可能な実装によって方程式が満たされることを示すために使用できる。
コデータの生成と操作には、通常、遅延評価と組み合わせた再帰関数が使用されます。非公式には、各帰納的コンストラクタに対してパターンマッチングによって関数を定義するのではなく、関数の結果に対して各「デストラクタ」または「オブザーバ」を定義します。
プログラミングにおいて、共論理プログラミング(略してco-LP)は、「論理プログラミングと共帰納論理プログラミングの自然な一般化であり、さらに無限木、遅延述語、同時通信述語などの論理プログラミングの他の拡張を一般化します。co-LPは、有理木、無限特性の検証、遅延評価、同時論理プログラミング、モデル検査、双類似性証明などに応用できます。」[ 1 ] co-LPの実験的な実装は、テキサス大学ダラス校[ 2 ] 、 Logtalk言語(例については [ 3 ]を参照)、およびSWI-Prologで利用可能です。
ベンジャミン・C・ピアースは著書『型とプログラミング言語』 [ 4 ] の中で、帰納法の原理と共帰納法の原理の両方について簡潔に述べている。この記事は主に帰納法を扱っているわけではないが、それらのやや一般化された形式を一度に検討することは有益である。原理を述べるためには、いくつかの予備知識が必要となる。
させてセットであり、単調関数であるつまり:
特に明記されていない限り、単調であると想定されます。
これらの用語は、次のように直感的に理解できます。は一連の主張であり、は、。 それからすでに主張された以上の結論を導き出せない場合、F-閉合となる。すべての主張が他の主張によって裏付けられている場合(つまり、「非F論理的な仮定」がない場合)、F-一貫性があると言えます。
クナスター・タルスキの定理によれば、(表記))はすべてのF-閉集合の共通部分によって与えられ、最大の不動点(と表記)は) は、すべてのF-整合集合の和集合によって与えられます。ここで、帰納法と共帰納法の原理を述べることができます。
前述の原理はやや不明瞭ですが、次のように考えると理解しやすいでしょう。帰納法の原理により、 F閉集合を示すだけで十分である。その性質が成り立つ。双対的に、あなたが示したいのはならば、F 整合セットを示すだけで十分である。~のメンバーであることが知られている。
以下のデータ型の文法を考えてみましょう。
つまり、型のセットには「最下位型」が含まれる。「トップタイプ」、および製品タイプ。これらのタイプは、アルファベットの上に文字列を重ねることで識別できます。。 させて上のすべての(おそらく無限の)文字列を表す関数を考えてみましょう:
この文脈では、「文字列の連結」を意味するシンボル、そして弦」ここでデータ型のセットを固定点として定義する必要があります。しかし、最小の固定点を取るか最大の固定点を取るかは重要だ。
仮にデータ型の集合として、帰納法の原理を用いて、次の主張を証明できます。
この結論に至るには、上のすべての有限文字列の集合を考えます。。 明らかに無限文字列を生成することはできないため、この集合はF-閉集合であることが判明し、結論が導かれる。
ここで、データ型の集合として、共帰納法の原理を用いて以下の主張を証明したいと思います。
ここ無限文字列を表す帰納法の原理を用いるために、次の集合を考えてみましょう。
このセットはF-一貫性があります。まず、第二に、そして、 我々は持っています文字列をシーケンスとして解釈する(関数は)有限接頭辞を前に付ける無限弦へ収量それ自体、。 したがって、そして共帰納法の原理により、。
注。 型を文字列として表現することは、基となるツリー構造に忠実ではありません。有限文字列など括弧なしでは曖昧であり、任意の無限文字列に対して連結すべての人々のために、したがって、異なるツリーを識別できます。これは、 F-一貫性による共帰納の原理を示すだけの上記の議論には影響しませんが、コンストラクタ構造を保持する必要がある設定では重要になります。標準的な構造的処理では、同型性によって型が表現されます。詳細はF-共代数を参照してください。
Haskellにおけるストリームの次の定義を考えてみましょう: [ 5 ]
データストリームa = S a (ストリームa )-- ストリームの「デストラクタ」head :: Stream a -> a head ( S a astream ) = a tail :: Stream a -> Stream a tail ( S a astream ) = astream最初の行は、ストリームは要素とそれに続くストリームで構成されると述べています(Sは要素のコンストラクタであり、は要素の任意の型を表します)。基本ケースがないため、これは根拠が不十分な定義のように思えますが、それでもプログラミングでは有用であり、推論することができます。いずれにせよ、ストリームは要素の無限リストであり、最初の要素を観察したり、要素の前に要素を置いて別のストリームを取得したりできます。
最終的なF-共代数これには以下の射が関連付けられています。
\nu F\rightarrow F(\nu F)=A\times \nu F}
これは別の共代数を誘導する関連する射を伴う。 なぜなら最終的であり、一意の射が存在する。
そのため
構成別のF-共代数準同型を誘導する。 以来が最終であるため、この準同型は一意であり、したがって合計すると以下のようになります。
これは同型性を証明するものであるこれは、明確に言えば、は固定点であるそして、その表記を正当化する。[ 6 ]
Stream A我々はそれが関手の最終余代数であることを示す。以下の実装例を検討してください。
out astream = ( head astream , tail astream ) out' ( a , astream ) = S a astreamこれらは互いに逆関係にあることが容易に確認でき、同型写像が成り立つことが証明される。詳細は参考文献を参照のこと。
帰納法の原理が数学的帰納法を包含することを示す。自然数の何らかの性質を仮定する。数学的帰納法の定義を以下のように定める。
次に関数を考えてみましょう:
容易に理解できるはずだしたがって、帰納法の原理により、ある性質を証明したい場合の示すだけで十分であるF閉集合である。具体的には、以下の条件を満たす必要がある。
つまり、
これはまさに、述べられている通りの数学的帰納法である。