Answers:
有多种定义数学结构的方法,具体取决于您认为哪些属性是定义。在等效的表征之间,您将哪个作为定义,而将哪个作为替代描述并不重要。
在构造数学中,最好选择一个使构造推理容易的定义。对于自然数,推理的基本形式是归纳法,这使得传统的零或后继定义非常适合。其他数字集没有这样的偏好。
在非构造条件下进行商数推理时,通常说“选择等价类的成员”。在建设性环境中,有必要描述如何挑选成员。这样就更容易使用为每个类型的成员构造一个对象的定义,而不是构造等效类。
例如,要定义,数学家可能会乐于等价于自然数的差异: 尽管它有一个整洁的感觉(没有“ this or that”),但是对于构造性的推理,如果对象相等与表示相等就更简单,因此我们可以将相对整数定义为自然数或自然数的负数减去1:ž:= Ñ 2 / { ((X ,Ý ),(X ',ÿ '))| X + Ŷ ' = X ' + ÿ }
Inductive Z1 :=
| Nonnegative : nat -> Z1 (* ⟦Nonnegative x⟧ = ⟦x⟧ *)
| Negative : nat -> Z1. (* ⟦Negative x⟧ = -⟦x⟧-1 *)
但是,此定义奇怪地是不对称的,这可能使得最好接受两个不同的表示形式为零:
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的标准库的用途又一定义:它构造正整数从它们的符号是基体2,作为随后的数字0或1的序列然后它构造数字1 Z
等Z3
从Pos3
上方。此定义还具有每个整数的唯一表示形式。使用二进制表示法的选择不是为了简化推理,而是在从证明中提取程序时产生更有效的代码。
易于推理是选择定义的动机,但它绝不是不可逾越的因素。如果某种构造使特定证明更容易,则可以在该特定证明中使用该定义,并证明该构造与最初选择为定义的另一种构造等效。
对于有理数,很难逃脱商数,除非我们从整数作为因子乘积的表示开始(这使得一些基本运算,例如加法和的总排序难以定义)。Coq标准库定义为(分子和分母),并定义了一个运算符来测试的两个元素的等效性。这个定义很普遍,因为它很简单。N × N *Q
=?=
Q
实数是完全不同的鱼,因为它们是不可构造的。将实数定义为归纳类型是不可能的(所有归纳类型都是可数的)。相反,实数的任何定义都必须是公理的,即非建设性的。可以构造实数的无数子集。这样做的方式取决于您要构造的子集。
吉尔斯答案是一个好答案,除了实数部分的段落完全是错误的,除了实数确实是不同的鱼。由于这种错误信息似乎非常普遍,因此我想在这里记录详细的反驳。
并非所有归纳类型都是可数的。例如感应式
Inductive cow :=
| nose : cow
| horn : (nat -> cow) -> cow.
是不可计数的,对于给定的任何序列,c : nat -> cow
我们可能形成horn c
的序列由于牛的有充分根据而不在序列中。如果要以“所有归纳类型都是可数”的形式正确声明,则必须严格限制允许的构造。
实数不能轻易地构造为归纳类型,除非在同伦类型理论中可以将它们构造为更高的归纳-归纳类型,请参阅HoTT书的第11章。可以说这是作弊。
与Gilles的说法相反,有许多关于实在的构造定义和构造。它们可以大致分为两类:
柯西型构造,其中实数被视为有理数的度量完成。这种构造通常需要商,尽管一个人可能可以摆脱一个词组式的定义,这取决于人如何对待平等。幼稚的构造通常也需要数不清的选择,但弗雷德·里奇曼(Fred Richman)给出了一个完成程序,该程序无需进行选择即可进行建设性的工作,请参见其实数和其他完成。
在实现方面,我们对实数进行了各种构造性形式化(但Coq标准库中没有那么糟糕的形式化形式),例如Robq Krebbers和Bas Spitters的Computer认证了Coq中的有效精确实数。
对于实际执行的具体实数我点你诺伯特·穆勒的iRRAM。