我想以明显的方式定义拓扑向量空间类:
theory foo
imports Real_Vector_Spaces
begin
class topological_vector = topological_space + real_vector +
assumes add_cont_fst: "∀a. continuous_on UNIV (λb. a + b)"
...
但我收到错误Type inference imposes additional sort constraint topological_space of type parameter 'a of sort type
我尝试在条件中引入类型约束,它看起来像
continuous_on
不希望与该类的默认类型'a
匹配。
当然,我可以通过用等效条件取代连续性来解决这个问题,我只是好奇为什么这不起作用。
答案 0 :(得分:2)
在Isabelle / HOL的类定义中,可能只出现一个类型变量(即'a
),它具有默认的HOL排序type
。因此,不能形式化多参数类型类。这也会影响内部类型类中的定义,这可能仅取决于一个类型类的参数。例如,您可以在类型类上下文cont :: 'a set => ('a => 'a) => bool
中定义谓词topological_space
,如下所示
definition (in topological_space) cont :: "'a set ⇒ ('a ⇒ 'a) ⇒ bool"
where "cont s f = (∀x∈s. (f ---> f x) (at x within s))"
目标(in topological_space)
告诉类型类系统cont
实际上只依赖于一种类型。因此,在继承自cont
的其他类型类的假设中使用topological_space
是安全的。
现在,Isabelle / HOL中的谓词continuous_on
的类型为'a set => ('a => 'b) => bool
,其中'a
和'b
必须为topological_space
排序。因此,continuous_on
比cont
更通用,因为它允许不同的拓扑空间a
和b
。相反,continuous_on
无法在任何 one 类型类中定义。因此,您也不能在类型类的假设中使用continuous_on
。此限制并非针对continuous_on
,它适用于所有类型的态射,例如mono
用于保持顺序的函数,代数结构之间的同态等。单参数类型的类不能表达这样的东西。
在您的示例中,您收到错误,因为Isabelle将所有发生的类型变量统一到'a
,然后意识到continuous_on
强制排序topological_space
'a
,但是由于上述原因,您可能不会依赖类别规范中的种类。
然而,可能有一个简单的出路。只需如上所述定义cont
,并在topological_vector
而非continuous_on
的假设中使用它。在课程背景之外,您可以证明cont = continuous_on
并使用continuous_on
而不是cont
推导出原始假设。这使您无法在类上下文中抽象地推理,但这只是一个小的限制。