これが証明のスケッチです。
プログラムは有限のサイズでなければならないことを考えると、プログラム内で定義されたすべてのタイプは、有限の数のメンバーのみを含み、有限の数の他のタイプのみを参照する必要があります。同じことが、プログラムのエントリポイントと、プログラムの初期化の前に定義されたオブジェクトにも当てはまります。
連続する配列(実行時の自然数を持つ型の積であり、したがってサイズに制約がない)がない場合、すべての型は上記の型の構成を通じて到達する必要があります。タイプの導出(pointer-to-pointer-to- )は、プログラムのサイズによって依然として制約されます。型を使用して実行時の値を構成するための連続した配列以外の機能はありません。A
これは少し論争の的です。たとえば、マッピングがプリミティブであると見なされる場合、キーが自然数であるマップで配列を近似できます。もちろん、マップの実装では、自己参照データ構造(Bツリー)または連続配列(ハッシュテーブル)を使用する必要があります。
次に、型が非再帰的である場合、型のチェーン(A
参照B
参照C
...)は終了する必要があり、プログラムで定義された型の数を超えてはなりません。したがって、プログラムが参照できるデータの合計サイズは、各タイプのサイズにプログラムで定義された名前の数(エントリポイントおよび静的データ)を掛けたものに制限されます。
これは、関数が再帰的であっても当てはまります(厳密に言えば、関数は型であるため、再帰型の禁止を破ります)。プログラムの任意の時点ですぐに表示されるデータの量は、各タイプのサイズにその時点で表示される名前の数を掛けたものに制限されます。
これの例外は、再帰関数呼び出しのスタックに「コンテナ」を格納する場合です。ただし、そのようなプログラムは、スタックを巻き戻し、データを再読み取りする必要がない限り、データをランダムにトラバースすることはできません。これは、失格のようなものです。
最後に、型を動的に作成できる場合、上記の証明は成り立ちません。たとえば、各セルが異なるタイプであるLispスタイルのリスト構造を作成できますcons<4>('h', cons<3>('e', cons<2>('l', cons<1>('l', cons<0>('o', nil)))))
。これは、ほとんどの静的型付き言語では不可能ですが、Pythonなどの一部の動的言語では可能です。