回答:
数学的構造を定義するには、定義と見なすプロパティに応じて、複数の方法があります。同等の特性評価の間で、どれを定義とするか、どれを代替特性とするかは重要ではありません。
建設的な数学では、建設的な推論を容易にする定義を選ぶことが望ましい。自然数の場合、推論の基本的な形式は帰納法です。これにより、従来のゼロまたは後続の定義が非常に適切になります。他の数のセットには、そのような設定はありません。
非建設的な状況で商を推論するとき、「同値類のメンバーを選びなさい」と言うのが一般的です。建設的な設定では、メンバーの選び方を説明する必要があります。これにより、等価クラスを構築するよりも、型の各メンバーに対して1つのオブジェクトを構築する定義を簡単に使用できます。
たとえば、を定義するために、数学者は自然数の差の同等化に満足している可能性があります 。Z:= N 2 / { ((x 、y )、(x ′、y ′))∣ x + y ′ = x ′ + y }
Inductive Z1 :=
| Nonnegative : nat -> Z1 (* ⟦Nonnegative x⟧ = ⟦x⟧ *)
| Negative : nat -> Z1. (* ⟦Negative x⟧ = -⟦x⟧-1 *)
ただし、この定義は奇妙に非対称であり、2つの異なる表現をゼロとして認めることが望ましい場合があります。
Inductive Z2 :=
| Nonnegative : nat -> Z2 (* ⟦Nonnegative x⟧ = ⟦x⟧ *)
| Nonpositive : nat -> Z2. (* ⟦Nonpostitive x⟧ = -⟦x⟧ *)
または、ナチュラルをビルディングブロックとして使用せずに相対整数を構築することもできます。
Inductive Pos3 :=
| I : Pos3 (* ⟦I⟧ = 1 *)
| S3 : Pos3 -> Pos3 (* ⟦S3 x⟧ = ⟦x⟧+1 *)
Inductive Z3 :=
| N3 : Pos3 -> Z3 (* ⟦N3 x⟧ = -⟦x⟧ *)
| O3 : Z3 (* ⟦O3⟧ = 0 *)
| P3 : Pos3 -> Z3 (* ⟦P3 x⟧ = ⟦x⟧ *)
Coq標準ライブラリはさらに別の定義を使用します。これは、表記1の後に正の整数を作成します。これは、数字1の後に一連の数字0または1が続くためです。その後、上記のZ
ように作成さZ3
れPos3
ます。この定義には、整数ごとに一意の表現もあります。バイナリ表記の使用の選択は、推論を容易にするためではなく、プログラムが証明から抽出されるときにより効率的なコードを生成するためです。
推論のしやすさは、定義を選択する動機ですが、決して克服できない要因ではありません。ある構造が特定の証明をより簡単にする場合、その特定の証明でその定義を使用し、その構造が最初に定義として選択された他の構造と同等であることを証明できます。
Q
=?=
Q
実数は構築できないため、まったく異なる魚のやかんです。実数を帰納型として定義することは不可能です(すべての帰納型は列挙可能です)。代わりに、実数の定義は公理的、すなわち非建設的でなければなりません。実数の列挙可能なサブセットを構築することが可能です。その方法は、構築するサブセットによって異なります。
実数が実際に別の魚のやかんであるという事実を除いて、実数に関する段落を除いて、ジルは正解です。この種の誤った情報はかなり広まっているようですので、ここでは詳細な反論を記録したいと思います。
すべての帰納的な型が列挙可能であることは真実ではありません。たとえば、誘導型
Inductive cow :=
| nose : cow
| horn : (nat -> cow) -> cow.
牛の十分な根拠によってシーケンスにないc : nat -> cow
私たちが形成horn c
する可能性のある任意のシーケンスを考えると、は列挙可能ではありません。「すべての帰納的型は可算である」という形式の正しい記述が必要な場合は、許可される構文を厳しく制限する必要があります。
ホモトピー型理論では、より高い誘導-誘導型として構築できることを除いて、実数は誘導型として簡単に構築できません。HoTTブックの第11章を参照してください。これは不正行為であると主張することができます。
ジルの主張に反して、現実には建設的な定義や構造がいくつかあります。それらは大きく2つのクラスに分類できます。
実数が有理数のメトリック完了として見られるコーシー型の構文。この種の構成では、商を必要とすることがよくありますが、平等をどのように扱うかに依存して、協調的定義でうまくいく場合もあります。素朴な構造は通常、数え切れないほどの選択肢も必要ですが、フレッド・リッチマンは選択なしで建設的に機能する完了手順を提供しました。彼の実数およびその他の完了を参照してください。
実装側では、実数のさまざまな構造化された形式化があります(ただし、Coq標準ライブラリにあるものはひどいものではありません)。たとえば、Robbert KrebbersやBas Spitters's Computerは、Coqで効率的な正確な実数を認定しています。
正確な実数の実際の実装については、NorbertMüllerのiRRAMを紹介します。