Isabelle中的商数类型模式是什么?

时间:2014-05-05 17:31:43

标签: isabelle theorem-proving

什么是"商数型模式"在伊莎贝尔?

我无法通过互联网找到任何解释。

1 个答案:

答案 0 :(得分:4)

如果你从你看到这个短语的地方引用一点点会更好。我知道“模式匹配”,我知道“商类型”,但我不知道“商模型”。

我不想要求澄清,然后等待,所以我选择了三个词中的两个,即“商型”。如果我走错了轨道,它仍然是一个有价值的主题,也是Isabelle / HOL的重要组成部分。

quotient_type个关键字,您可以使用equivalence relation定义新类型。

它是商包的一部分,从isar-ref.pdf的第248页开始描述。碰巧有一个Wiki页面,Quotient_type

Brian Hufmann和OndřejKunčar给出了更为复杂的描述。转到Kunčar的web page并查看标题为提升和转移:Isabelle / HOL中的商数的模块化设计的两个PDF,它们并不完全相同。

恰好是提升和商数类型密切相关,并且不易理解,这就是为什么我现在尝试在这里和那里学习一点,以便更好地理解它。

HOL中的整数和理性是商数类型,我选择一个作为示例,整数

您可以先查看Int.thy

对于商类型,您需要一个等价关系,它定义一个集合,而intrel是用于定义类型int的集合的。{/ p>

definition intrel :: "(nat * nat) => (nat * nat) => bool" where
  "intrel = (%(x, y) (u, v). x + v = u + y)"

这是基于自然数的整数的经典定义。整数是有序的自然数对(和我在下面描述的集合),并且它们与该定义相等。

例如,非正式地(2,3) = (4,5)因为2 + 5 = 4 + 3

我很无聊,你在等待好事。这是其中的一部分,使用quotient_type

quotient_type int = "nat * nat" / "intrel"
  morphisms Rep_Integ Abs_Integ

这两个态射开始发挥作用,如果你想让你的大脑紧张,并且真正理解我正在做什么。 quotient_type生成了很多函数和简单规则,你必须做很多工作才能找到它,例如使用find_theorems命令。

Abs函数将有序对抽象为int。看看这些:

lemma "Abs_Integ(1,0) = (1::int)"
  by(metis one_int_def) 

lemma "Abs_Integ(x,0) + Abs_Integ(y,0) ≥ (0::int)"
  by(smt int_def) 

他们表明,int确实是一个有序的对,位于引擎的引擎盖下。

现在,我展示了这些态射的显式类型,以及Abs_intRep_int,它们不仅将int显示为有序对,而且还显示为一组有序对。 / p>

term "Abs_int   :: (nat * nat) set => int"  
term "Abs_Integ :: (nat * nat) => int"

term "Rep_int   :: int => (nat * nat) set"
term "Rep_Integ :: int => (nat * nat)"

我再次无聊,但我有情感需要展示更多的例子。如果有序对的组件相差一个,则两个正整数相等,例如:

lemma "Abs_Integ(1,0) = Abs_Integ(3,2)"
  by(smt nat.abs_eq split_conv) 

lemma "Abs_Integ(4,3) = Abs_Integ(3,2)"
  by(smt nat.abs_eq split_conv)

如果添加Abs_Integ(4,3)Abs_Integ(3,2),您会有什么期望?这样:

lemma "Abs_Integ(2,3) + Abs_Integ(3,4) = Abs_Integ(2 + 3, 3 + 4)"
  by(metis plus_int.abs_eq plus_int_def split_conv)

证明中的plus_intline 44的Int.thy中定义。

lift_definition plus_int :: "int => int => int"
  is "%(x, y) (u, v). (x + u, y + v)"

这个提升到底是什么?这会让我在“解决这个问题的日子里”,我只是开始理解它。

find_theorems显示隐藏了很多东西,正如我所说:

thm "plus_int.abs_eq"  

find_theorems name: "Int.plus_int*"

更多示例,但这些要强调的是,在引擎的引擎下,int作为一个集合返回到等价类中,我在上面使用intrel来定义设置正确:

term "Abs_int::(nat * nat) set => int"
term "Abs_int {(x,y). x + 3 = 2 + y}" (*(2,3)*)
term "Abs_int {(x,y). x + 4 = 3 + y}" (*(3,4)*)

lemma "Abs_int {(x,y). x + 3 = 2 + y} = Abs_int {(x,y). x + 100 = 99 + y}"
  by(auto)

auto证据很容易,但是下一个证明我没有任何魔法,即使它很简单。

lemma "Abs_int {(x,y). x + 3 = 2 + y} + Abs_int {(x,y). x + 4 = 3 + y}
        = Abs_int {(x,y). x + 7 = 5 + y}"
apply(auto simp add: plus_int.abs_eq plus_int_def intrel_def)
oops

可能我需要做的就是点击默认情况下不是简单规则的东西。

如果quotient_type不是您所说的“商型模式”,至少我通过查看find_theorems返回Int.plus_int*以上{{1}}的所有内容得到了一些东西。< / p>