将排序区域设置与部分映射一起使用

时间:2016-06-24 15:10:07

标签: isabelle partial-ordering

以下代码没有进行类型检查:

type_synonym env = "char list ⇀ val"

interpretation map: order "op ⊆⇩m :: (env ⇒ env ⇒ bool)" "(λa b. a ≠ b ∧ a ⊆⇩m b)"
by unfold_locales (auto intro: map_le_trans simp: map_le_antisym)

lemma
  assumes "mono (f :: env ⇒ env)"
  shows "True"
by simp

Isabelle在引理中抱怨以下错误:

Type unification failed: No type arity option :: order

Type error in application: incompatible operand type

Operator:  mono :: (??'a ⇒ ??'b) ⇒ bool
Operand:   f :: (char list ⇒ val option) ⇒ char list ⇒ val option

为什么这样?我错过了使用解释的东西吗?我怀疑我需要类似newtype包装的东西......

1 个答案:

答案 0 :(得分:1)

当您解释类似于order的区域设置(对应于类型类)时,您只能获得在区域设置上下文中证明的定理。但是,常量mono仅在类型类上定义。原因是mono的类型包含两个类型变量,而在类型类的语言环境中只有一个可用。您可以注意到这一点,因为您的解释没有map.mono

如果为order小于None的选项类型实例化类型类Some x,则可以对映射使用mono,因为函数空间实例化具有逐点顺序的order。但是,地图上的排序<=仅在语义上等同于⊆⇩m,而不是语法上的,因此关于⊆⇩m的现有定理都不适用于<=,反之亦然。此外,您的理论将与以order option monotone实例化的其他人不相容。

因此,我建议不要使用类型类。谓词monotone (op ⊆⇩m) (op ⊆⇩m) f明确接受要使用的顺序。这是一个更多的写作,但最后,你比类型类更灵活。例如,您可以编写f来表示{data = function() {[{id:"1441-aeze",name:"theme1"},{id:"1441-aezb",name:"theme2"},{id:"1441-aezc",name:"theme3-a"},{id:"1441-aezd",name:"theme1-mtr"},{id:"1441-aezf",name:"theme4"}]}} 是对环境的单调转换。