Isabelle 如何使typedef类型从其类型类的母类型继承运算符
回答后续问题后发布 Brian给出了一个答案,并建议使用提升和转移。然而,我找不到足够的关于举重和转移的教程信息,不知道如何调整他的答案来完成我需要做的事情 在这里,我在黑暗中工作,并使用给出的答案作为即插即用模板来问这个后续问题 我的初始代码中的命令,Isabelle 如何使typedef类型从其类型类的母类型继承运算符,isabelle,Isabelle,回答后续问题后发布 Brian给出了一个答案,并建议使用提升和转移。然而,我找不到足够的关于举重和转移的教程信息,不知道如何调整他的答案来完成我需要做的事情 在这里,我在黑暗中工作,并使用给出的答案作为即插即用模板来问这个后续问题 我的初始代码中的命令,typedef trivAlg=“{x::sT.x=emS}”为我提供了一个新类型,它是母类型sT的子集 我有我的成员操作符consts inP::“sT=>sT=>bool”,因此在我关于提升和转移的天真观点中,因为我的monoid\u add
typedef trivAlg=“{x::sT.x=emS}”
为我提供了一个新类型,它是母类型sT
的子集
我有我的成员操作符consts inP::“sT=>sT=>bool”
,因此在我关于提升和转移的天真观点中,因为我的monoid\u add
0被定义为常量emS::sT
,我可以这样说,(emS::sT)inP emS
,我想做这样的事情:
theorem "~((0::trivAlg) inP 0)"
lift_definition inP_trivAlg :: "trivAlg => trivAlg => bool"
is "% x y. (x inP y)"
by simp
theorem "~((0::trivAlg) inP 0)"
theorem "(emS::trivAlg) = emS"
consts emS :: "sT"
consts inP :: "sT => sT => bool"
consts geU :: "sT => sT"
lift_definition in_P_trivAlg :: "trivAlg => trivAlg => bool"
is "in_P :: sT => sT => bool"
by simp
theorem "~(in_P_trivAlg 0 0)"
by(metis
Ax_em
in_P_trivAlg.rep_eq
zero_trivAlg.rep_eq)
因此,我尝试使用提升让我的操作员inP
使用类型trivAlg
,如下所示:
theorem "~((0::trivAlg) inP 0)"
lift_definition inP_trivAlg :: "trivAlg => trivAlg => bool"
is "% x y. (x inP y)"
by simp
theorem "~((0::trivAlg) inP 0)"
theorem "(emS::trivAlg) = emS"
consts emS :: "sT"
consts inP :: "sT => sT => bool"
consts geU :: "sT => sT"
lift_definition in_P_trivAlg :: "trivAlg => trivAlg => bool"
is "in_P :: sT => sT => bool"
by simp
theorem "~(in_P_trivAlg 0 0)"
by(metis
Ax_em
in_P_trivAlg.rep_eq
zero_trivAlg.rep_eq)
但是,我使用的定理
与类型冲突,因为我使用的类型sT
与trivAlg
不兼容
如果可以添加答案,向我展示如何让我的inP
使用typetrivAlg
,我将不胜感激。或者,也许我太离谱了
对(原始)问题的准备
我有我的类型sT
,它表示“一切都是一个集合”。到目前为止,我所有的常量和运算符都是用单一类型sT
定义的。例如,my empty set、membership运算符和union运算符的定义如下:
theorem "~((0::trivAlg) inP 0)"
lift_definition inP_trivAlg :: "trivAlg => trivAlg => bool"
is "% x y. (x inP y)"
by simp
theorem "~((0::trivAlg) inP 0)"
theorem "(emS::trivAlg) = emS"
consts emS :: "sT"
consts inP :: "sT => sT => bool"
consts geU :: "sT => sT"
lift_definition in_P_trivAlg :: "trivAlg => trivAlg => bool"
is "in_P :: sT => sT => bool"
by simp
theorem "~(in_P_trivAlg 0 0)"
by(metis
Ax_em
in_P_trivAlg.rep_eq
zero_trivAlg.rep_eq)
我现在正在做一些早期调查,看看是否可以将我的sT
与中的广义组联系起来
从中,我试图从组的第4.2、4.3和4.4节以及Nat的第15.2和15.3节中获取示例
在这里,我几乎要回答我的问题了,但我不知道我是否在问一个聪明的问题。我想我知道的是,解决方案可能只使用区域设置、子区域设置和解释,而不是使用类型类
我一直在研究和,所以我知道区域设置和类是相互交织的。我还一直在研究如何在那里使用语言环境、子语言环境和解释
问题
我的问题是,对于我下面的简单代数结构,trivAlg
,这是一个用typedef
定义的新类型,我如何设置类型类,以便我可以使用我的常量,例如上面列出的emS
、inP
和geU
,以及trivAlg
类型的元素
在我列出下面的代码之后,我问了一些关于中特定代码行的问题
代码
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中的第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)
类半群+
假设加法运算[代数运算,字段运算]:(a+b)+c=a+(b+c)
子局部半群_add如果我想使用Groups.thy中的
半组_add
,我可以选择将其用作类型类还是区域设置 要获得trivAlg类型的相应操作,最简单的方法可能是使用Isabelle的提升包;然后可以使用传输包来证明类实例。以下是一个例子:
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
如果我不知道语法意味着什么,简单的事情会让我丧命,而学习Isabelle/HOL的大部分内容是“长时间盯着多个示例”,这并不是说Isabelle相对于其他证明助手没有太多文档 在这里,我结束了关于如何实际使用Brian给我的东西的问题 我的
inP
实际上是p::sT=>sT=>bool中函数的二进制表示法,这就是我想输入trivAlg
,尽管我不确定刚才是否正确使用了术语“lift”
从中,我找到了一个显示提升HOLunion
运算符的示例。类似地,我将放入\u P
中,如下所示:
theorem "~((0::trivAlg) inP 0)"
lift_definition inP_trivAlg :: "trivAlg => trivAlg => bool"
is "% x y. (x inP y)"
by simp
theorem "~((0::trivAlg) inP 0)"
theorem "(emS::trivAlg) = emS"
consts emS :: "sT"
consts inP :: "sT => sT => bool"
consts geU :: "sT => sT"
lift_definition in_P_trivAlg :: "trivAlg => trivAlg => bool"
is "in_P :: sT => sT => bool"
by simp
theorem "~(in_P_trivAlg 0 0)"
by(metis
Ax_em
in_P_trivAlg.rep_eq
zero_trivAlg.rep_eq)
在我以前的尝试和错误尝试中,我一直在使用我的inP
,这是唯一的符号,它没有陷入lift\u定义中,它引入了一个全新的功能。这些事情最终发生在我身上,我没有“尝试和错误”,而是通过智能地使用_P_trivAlg
中的函数,获得了“尝试和成功”:
theorem "~((0::trivAlg) inP 0)"
lift_definition inP_trivAlg :: "trivAlg => trivAlg => bool"
is "% x y. (x inP y)"
by simp
theorem "~((0::trivAlg) inP 0)"
theorem "(emS::trivAlg) = emS"
consts emS :: "sT"
consts inP :: "sT => sT => bool"
consts geU :: "sT => sT"
lift_definition in_P_trivAlg :: "trivAlg => trivAlg => bool"
is "in_P :: sT => sT => bool"
by simp
theorem "~(in_P_trivAlg 0 0)"
by(metis
Ax_em
in_P_trivAlg.rep_eq
zero_trivAlg.rep_eq)
这表示空集不包含自身。这很好,并且告诉我,考虑到0已经被定义为emS
,这是用axiomAx_em
定义的,不包含任何元素,我的思路是正确的
我现在需要弄清楚如何重载我的会员资格操作符符号\\\iota>
。重载符号直到现在都不重要,因为我需要避免重载大多数标准符号,比如\
看起来我需要重新命名定理,比如p_trivAlg.rep_eq中的,我刚刚从中得到了答案
从中,我现在看到使用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答案的链接,该代码的用途对我来说毫无意义。提升和转移看起来很有希望,因为我喜欢typedef
的想法,它可以轻松地获得我类型的新子集sT
。我留下了一个后续问题,如果你有时间回答的话。我会的