1

在上一个问题中,我询问了关于形式化欧几里得空间子集的问题,我收到了以下关于如何创建 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 ℕ)

减少产生了预期的结果。然后我返回并用ℝ替换了ℕ:

def euclidean_space (n : ℕ) : Type := (repeated_prod n ℝ)

euclidean_subset仍然编译,但是#reduce仍然使用 ℝ 给出超时。为什么ℕ不超时?

4

1 回答 1

2

real是一个定义,所以它也会被缩减:

def real := @cau_seq.completion.Cauchy ℚ _ _ _ abs _

https://github.com/leanprover/mathlib/blob/a243126efbd7ddef878876bb5a1bb3af89f2e33b/data/real/basic.lean#L12

实际上,这是一个复杂的(不是双关语)定义,可能依赖于数十或数百个其他定义。递归地减少所有这些将需要很长时间,并且会产生一些巨大且完全无用的输出。

另一方面,nat是一种无参数的归纳类型。那里没有什么可以减少的。

于 2018-10-04T21:16:04.403 回答