是什么使自然数在超时方面如此特别?

时间:2018-10-04 18:07:46

标签: lean

在先前的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给出超时。 ℕ为什么不超时?

1 个答案:

答案 0 :(得分:2)

real是一个定义,因此也会减少:

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

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

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

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