如何获取typedef类型以从类型类的母类继承运算符

时间:2013-04-08 22:04:34

标签: isabelle

发布回答后续问题

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时遇到了类型冲突,因为我对sTtrivAlg类型的使用不兼容。

如果可以添加答案,以告诉我如何让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.pdfclasses.pdf,所以我知道语言环境和类是交织在一起的。我也一直在关注IsarMathLib,看看在那里如何使用区域设置,子区域和解释。

问题

我的问题是,使用我的琐碎代数结构trivAlg,这是一个用typedef定义的新类型,我如何设置类型类,以便我可以使用我的常量,例如上面列出的emSinPgeU,以及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,我可以选择将其用作类型类还是语言环境?

2 个答案:

答案 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答案,那么该代码的目的对我没有任何意义。