Isabelle 如何使typedef类型从其类型类的母类型继承运算符

Isabelle 如何使typedef类型从其类型类的母类型继承运算符,isabelle,Isabelle,回答后续问题后发布 Brian给出了一个答案,并建议使用提升和转移。然而,我找不到足够的关于举重和转移的教程信息,不知道如何调整他的答案来完成我需要做的事情 在这里,我在黑暗中工作,并使用给出的答案作为即插即用模板来问这个后续问题 我的初始代码中的命令,typedef trivAlg=“{x::sT.x=emS}”为我提供了一个新类型,它是母类型sT的子集 我有我的成员操作符consts inP::“sT=>sT=>bool”,因此在我关于提升和转移的天真观点中,因为我的monoid\u add

回答后续问题后发布

Brian给出了一个答案,并建议使用提升和转移。然而,我找不到足够的关于举重和转移的教程信息,不知道如何调整他的答案来完成我需要做的事情

在这里,我在黑暗中工作,并使用给出的答案作为即插即用模板来问这个后续问题

我的初始代码中的命令,
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
使用type
trivAlg
,我将不胜感激。或者,也许我太离谱了

对(原始)问题的准备

我有我的类型
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”

从中,我找到了一个显示提升HOL
union
运算符的示例。类似地,我将
放入\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
,这是用axiom
Ax_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
。我留下了一个后续问题,如果你有时间回答的话。我会的