定义欧几里得空间的子集很麻烦

时间:2018-10-02 23:10:54

标签: lean

我正在使用Lean来形式化欧几里德空间(R ^ n)子集的概念。

我尝试了以下方法:

import analysis.real

def repeated_prod : ℕ → Type → Type
| 0 s := empty
| 1 s := s
| (n + 1) s := prod s (repeated_prod n s)

structure euclidean_space (n : ℕ) : Type :=
(space : set (repeated_prod n ℝ))

def euclidean_subset (M : Type) := ∃ n : ℕ, (set M) ⊆ (euclidean_space.mk n).space

尝试使用英语:

  1. 实数(R)在mathlib的分析组件中定义。
  2. 我们需要将其推广到k个维度,因此我们希望R的笛卡尔积与它自身任意次数。
  3. repeated_prod允许采用任意类型并多次应用笛卡尔积。
  4. euclidean_space是R的特殊情况。
  5. 如果存在某个欧几里德空间,我们说这是euclidean_subset(注意:我试图避免提及维,所以它是 some R ^ n。)该集合(M是该子集的子集。

这会出现错误:

euclidean.lean:11:52: error: failed to synthesize type class instance for
M : Type,
n : ℕ
⊢ has_subset Type
euclidean.lean:11:74: error: maximum class-instance resolution depth has been reached (the limit can be increased by setting option 'class.instance_max_depth') (the class-instance resolution trace can be visualized by setting option 'trace.class_instances')

尽管我承认trace.class_instances的默认值是什么,我将其设置为10000,但花费了更长的时间,并且给出了相同的错误消息,导致我它那里错误消息是误导。似乎找不到关于这种语言的很多信息,包括我收到的错误消息,解决该错误的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您有两个编译错误,尽管其中一个不可见。首先,您无法使用mk来创建欧几里得空间。我建议暂时将结构更改为def,因为您的结构只有一个字段:

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

那么维数为n的欧氏空间就是euclidean_space n

第二,类型与集合不同,因此这就是精益无法为has_subset Type找到实例的原因。在构造演算中,精益所基于的类型理论认为类型不能真正是面向对象编程意义上的其他类型的子类型-尽管您可以使用“子类型类型”和/或胁迫来模拟这一点。因此,这就是我更改您的代码的方式-而不是euclidean_subset谓词试图检查某物是否是子集,而是针对某些{来检查它是否是euclidean space n的子类型。 {1}}:

n