发布回答后续问题
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
类型,我将不胜感激。或者,也许我已经离开了。
(原始)问题的预备
我的类型sT
代表“一切都是一套”。到目前为止,我的所有常量和运算符都是使用单一类型sT
定义的。例如,我的空集,成员运算符和union运算符的定义如下:
consts emS :: "sT"
consts inP :: "sT => sT => bool"
consts geU :: "sT => sT"
我现在正在做一些早期调查,看看我是否可以将sT
绑定到Groups.thy中的广义群组中。
从HOL document开始,我试图从群组的4.2,4.3和4.4节以及Nat的15.2和15.3节中获取示例。
在这里,我几乎是我的问题,但我不知道我是否在问一个聪明的问题。我想我所知道的是,解决方案可能仅限于语言环境,子语言和解释,而不是类型类。
我一直在寻找locales.pdf和classes.pdf,所以我知道语言环境和类是交织在一起的。我也一直在关注IsarMathLib,看看在那里如何使用区域设置,子区域和解释。
问题
我的问题是,使用我的琐碎代数结构trivAlg
,这是一个用typedef
定义的新类型,我如何设置类型类,以便我可以使用我的常量,例如上面列出的emS
,inP
和geU
,以及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)
没有一个文档可以教我如何使用类,语言环境,子语言和解释,所以我不知道这到底告诉我什么。
如果我想使用Groups.thy中的semigroup_add
,我可以选择将其用作类型类还是语言环境?
答案 0 :(得分:3)
要在类型trivAlg
上获得相应的操作,最简单的方法可能是使用Isabelle的Lifting包;然后,您可以使用Transfer包来证明类实例。这是一个例子:
typedef trivAlg = "{x::sT. x = emS}"
by auto
setup_lifting type_definition_trivAlg
instantiation trivAlg :: zero
begin
lift_definition zero_trivAlg :: "trivAlg" is "emS" .
instance ..
end
instantiation trivAlg :: monoid_add
begin
lift_definition plus_trivAlg :: "trivAlg => trivAlg => trivAlg"
is "% x y. emS"
by simp
instance proof
fix n m q :: trivAlg
show "(n + m) + q = n + (m + q)"
by transfer simp
show "0 + n = n"
by transfer simp
show "n + 0 = n"
by transfer simp
qed
end
答案 1 :(得分:1)
如果我不知道语法是什么意思,简单的事情会杀了我,并且学习Isabelle / HOL的很多东西“长时间盯着多个例子”,这并不是说有很多文档没有伊莎贝尔相对于其他证明助理。
在这里,我完成了关于如何实际使用Brian给我的问题。
我的inP
实际上是函数in_P :: sT => sT => bool
的二进制表示法,这是我想要提升到trivAlg
类型的内容,虽然我不确定我刚刚使用了这个术语正确地“抬起”。
从Isabelle user's list,我找到了一个示例,显示了HOL union
运算符的解除。同样,我这样抬起in_P
:
lift_definition in_P_trivAlg :: "trivAlg => trivAlg => bool"
is "in_P :: sT => sT => bool"
by simp
在我之前的尝试和错误尝试中,我一直在使用我的inP
,这只是符号,并且它没有沉没,lift_definition
正在引入一个全新的功能。那些事情最终发生在我身上,而不是“反复试验”,我通过智能地使用函数in_P_trivAlg
得到了“试验和成功”:
theorem "~(in_P_trivAlg 0 0)"
by(metis
Ax_em
in_P_trivAlg.rep_eq
zero_trivAlg.rep_eq)
这表示空集不包含自身。这很好,并告诉我,我已经走上正轨,考虑到0被定义为emS
,其定义为公理Ax_em
,不包含任何元素。
我现在需要弄清楚如何重载我的成员资格运算符表示法\<in>\<^isub>\iota>
。到目前为止,重载符号并不重要,因为我需要不重载大多数标准符号,例如\<in>
。
看起来我需要重命名定义,例如in_P_trivAlg.rep_eq
,我只是从"Can I define multiple names for a theorem?"得到答案。
从RealVector.thy开始,我现在看到使用lemmas
命令进行了大量重命名,例如
text {* Recover original theorem names *}
lemmas scaleR_left_commute = real_vector.scale_left_commute
lemmas scaleR_zero_left = real_vector.scale_zero_left
...
如果我没有提供链接的Stackoveflow答案,那么该代码的目的对我没有任何意义。