在先前的question I asked about formalizing subsets of Euclidean Spaces中,我收到了有关如何创建n维欧几里得空间的以下答复:
def euclidean_space (n : ℕ) : Type := set (repeated_prod n ℝ)
我收到以下有关创建欧几里得空间子集的响应:
def euclidean_subset (M : Type) := ∃ (n : ℕ) (P : euclidean_space n → Prop), M = subtype P
在修改后的代码中运行的所有编译结果都很棒,并且确实相信答案(至少大部分是正确的)。我想尝试对代码运行一些基本检查。我特别希望:
#reduce euclidean_space 2
给出:
ℝ × ℝ
好吧,不是。超时了。然后,我继续尝试其他设置。我将euclidean_space
修改为:
def euclidean_space (n : ℕ) : Type := set (repeated_prod n ℕ)
尽管不再忠实于它的名字,但人们应该期待
#reduce euclidean_space 2
给出:
ℕ × ℕ
好吧,差不多,它给出了:
ℕ × ℕ → Prop
鉴于结果,我删除了set
调用,并将euclidean_space
重新定义为:
def euclidean_space (n : ℕ) : Type := (repeated_prod n ℕ)
其还原产生期望的结果。然后,我返回并用replaced替换了ℕ:
def euclidean_space (n : ℕ) : Type := (repeated_prod n ℝ)
euclidean_subset
仍在编译,但是#reduce
仍使用gives给出超时。 ℕ为什么不超时?
答案 0 :(得分:2)
real
是一个定义,因此也会减少:
def real := @cau_seq.completion.Cauchy ℚ _ _ _ abs _
实际上,它是一个复杂的(无双关语)定义,可能取决于数十个或数百个其他定义。递归地减少所有这些将花费很长时间,并且会产生一些巨大且完全无用的输出。
另一方面,nat
是无参数归纳类型。没有什么可以减少的。