发布答案跟进问题
Brian 提供了一个答案,建议的解决方案是使用提升和转移。但是,我找不到足够的关于提升和转移的教程信息来了解如何调整他的答案以完成我需要做的事情。
在这里,我在黑暗中工作,并使用作为即插即用模板给出的答案来提出这个后续问题。
我初始代码中的命令为我typedef trivAlg = "{x::sT. x = emS}"
提供了一个新类型,它是母类型的子集sT
。
我有我的会员操作员consts inP :: "sT => sT => bool"
,所以在我对提升和转移的天真看法中,因为我的monoid_add
0 已被定义为常量emS::sT
,我可以做出这样的声明,(emS::sT) inP emS
我想做这样的事情:
theorem "~((0::trivAlg) inP 0)"
所以,我尝试使用提升让我的操作员使用这样inP
的类型trivAlg
:
lift_definition inP_trivAlg :: "trivAlg => trivAlg => bool"
is "% x y. (x inP y)"
by simp
theorem "~((0::trivAlg) inP 0)"
theorem "(emS::trivAlg) = emS"
theorem
但是,由于我使用的类型sT
与我的使用trivAlg
不兼容,因此我遇到了类型冲突。
如果可以添加答案以向我展示如何让我inP
使用类型,trivAlg
我将不胜感激。或者,也许我离题了。
(原始)问题的预备知识
我有我的 type sT
,它代表“一切都是一个集合”。到目前为止,我所有的常量和操作符都是用单一类型定义的sT
。例如,我的空集、成员运算符和联合运算符定义如下:
consts emS :: "sT"
consts inP :: "sT => sT => bool"
consts geU :: "sT => sT"
我现在正在做一些早期调查,以了解我是否可以将 my与Groups.thysT
中的广义组联系起来。
从HOL 文档中,我试图从 Groups 的 4.2、4.3 和 4.4 节以及 Nat 的 15.2 和 15.3 节中获取示例。
在这里,我几乎要回答我的问题,但我不知道我是否在问一个聪明的问题。我想我知道的是,解决方案可能只使用语言环境、子语言环境和解释,而不是类型类。
我一直在看locales.pdf和classes.pdf,所以我知道语言环境和类是交织在一起的。我也一直在查看IsarMathLib以了解在那里如何使用语言环境、子语言环境和解释。
问题
我的问题是,在下面我的微不足道的代数结构中trivAlg
,这是一个用 定义的新类型typedef
,我如何使用类型类进行设置,以便我可以将我的常量(例如emS
,上面列出的)inP
与geU
type 的元素一起使用trivAlg
?
在我列出下面的代码之后,我会问一些关于Groups.thy中特定代码行的问题。
编码
typedef trivAlg = "{x::sT. x = emS}"
by auto
instantiation trivAlg :: zero
begin
definition trivAlg_zero:
"0 = Abs_trivAlg emS"
instance ..
end
instantiation trivAlg :: monoid_add
begin
definition plus_trivAlg:
"m + n = (Abs_trivAlg emS)"
instance proof
fix n m q :: trivAlg
show "(n + m) + q = n + (m + q)"
by(metis plus_trivAlg)
show "0 + n = n"
apply(induct n) apply(auto)
by(metis plus_trivAlg)
show "n + 0 = n"
apply(induct n) apply(auto)
by(metis plus_trivAlg)
qed
end
theorem
"((n::trivAlg) + m) + q = n + (m + q)"
by(metis plus_trivAlg)
theorem
"((0::trivAlg) + 0) = 0"
by(metis monoid_add_class.add.left_neutral)
关于 Groups.thy 的后续问题
在 Groups.thy 的第 151 到 155 行,有以下代码:
class semigroup_add = plus +
assumes add_assoc [algebra_simps, field_simps]: "(a + b) + c = a + (b + c)"
sublocale semigroup_add < add!: semigroup plus proof
qed (fact add_assoc)
没有一个文档可以教我如何使用类、语言环境、子语言环境和解释,所以我不知道它到底告诉了我什么。
如果我想使用semigroup_add
Groups.thy 中的那个,我可以选择将它用作类型类还是区域设置?