将排序语言环境与部分地图一起使用
Using the ordering locale with partial maps
以下代码不进行类型检查:
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 wrapper 这样的东西...
当你解释像 order
这样对应于类型 class 的语言环境时,你只能得到在语言环境上下文中证明的定理。但是,常量 mono
仅在类型 class 上定义。原因是 mono
的类型包含两个类型变量,而类型 classes 中只有一个在语言环境中可用。您可以注意到这一点,因为没有 map.mono
来自您的解释。
如果实例化类型class order
作为None
小于Some x
的选项类型,那么你可以对地图使用mono
,因为函数 space 用逐点顺序实例化 order
。但是,地图上的排序 <=
仅在语义上等同于 ⊆⇩m
,在句法上不等价,因此关于 ⊆⇩m
的现有定理中的 none 将适用于 <=
反之亦然。此外,您的理论将与其他人以不同方式为 option
实例化 order
的理论不兼容。
因此,我建议不要输入 classes。谓词 monotone
明确采用要使用的顺序。这样写的有点多,但是说到底,你比用type classes更灵活。例如,您可以写 monotone (op ⊆⇩m) (op ⊆⇩m) f
来表示 f
是环境的单调变换。
以下代码不进行类型检查:
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 wrapper 这样的东西...
当你解释像 order
这样对应于类型 class 的语言环境时,你只能得到在语言环境上下文中证明的定理。但是,常量 mono
仅在类型 class 上定义。原因是 mono
的类型包含两个类型变量,而类型 classes 中只有一个在语言环境中可用。您可以注意到这一点,因为没有 map.mono
来自您的解释。
如果实例化类型class order
作为None
小于Some x
的选项类型,那么你可以对地图使用mono
,因为函数 space 用逐点顺序实例化 order
。但是,地图上的排序 <=
仅在语义上等同于 ⊆⇩m
,在句法上不等价,因此关于 ⊆⇩m
的现有定理中的 none 将适用于 <=
反之亦然。此外,您的理论将与其他人以不同方式为 option
实例化 order
的理论不兼容。
因此,我建议不要输入 classes。谓词 monotone
明确采用要使用的顺序。这样写的有点多,但是说到底,你比用type classes更灵活。例如,您可以写 monotone (op ⊆⇩m) (op ⊆⇩m) f
来表示 f
是环境的单调变换。