当在isabelle / hol中证明解释时,多态“修复”语句

时间:2015-11-22 16:57:16

标签: polymorphism isabelle

我正试图证明一些关于多变量的基本事实 多项式,因此需要一个多度的类型。为了模仿这个,我 使用了一些未指定类型的变量名称的部分函数 自然数:

type_synonym 'v multi_degree = "'v ⇒ nat"

还有一些涉及有限支持的东西,但事实并非如此 对这个问题真的很重要。然后我定义了添加 以明显的逐点方式进行多学位:

definition zero_degree :: "'v multi_degree" where "zero_degree = (λ v. 0)"

definition md_plus :: "'v multi_degree ⇒ 'v multi_degree ⇒ 'v multi_degree" (infix "⊕" 70) where
  "(d1 ⊕ d2) = (λ v. d1 v + d2 v)"

lemma assoc_md_plus [simp]: "d1 ⊕ (d2 ⊕ d3) = (d1 ⊕ d2) ⊕ d3"
  by (rule; simp add: md_plus_def)

lemma ident_zero_degree [simp]: "d ⊕ zero_degree = d" and "zero_degree ⊕ d = d"
  by (auto simp add: md_plus_def zero_degree_def)

lemma sym_md_plus: "d ⊕ d' = d' ⊕ d"
  by (rule; simp add: md_plus_def)

现在我想说多度的加法具有结构 一个可交换的幺半群。写的显而易见的事情是这样的 这样:

interpretation md: comm_monoid "op ⊕" "zero_degree"
proof

到目前为止一直很好:输出是

goal (3 subgoals):
 1. ⋀a b c. (a ⊕ b) ⊕ c = a ⊕ (b ⊕ c)
 2. ⋀a b. a ⊕ b = b ⊕ a
 3. ⋀a. a ⊕ zero_degree = a

我绝对可以证明!但是,如果我现在写

interpretation md: comm_monoid "op ⊕" "zero_degree"
proof
  fix a
  show "a ⊕ zero_degree = a" by simp

然后我收到警告

Introduced fixed type variable(s): 'c in "a__"

有没有办法避免警告?就目前而言,我已经作弊并证明了这一点

的解释
interpretation md: comm_monoid "op ⊕" "zero_degree"
  by (unfold_locales; simp?; rule sym_md_plus)

有效,但对未来的读者来说并不十分清楚......

1 个答案:

答案 0 :(得分:2)

只需写下fix a :: "'a multi_degree"即可。如果没有其他约束,Isabelle将选择'a作为类型变量。但是,我会认为明确地实际绑定类型变量是好的方式,例如

interpretation md: comm_monoid "op ⊕" "zero_degree :: 'a multi_degree"
proof
  fix a :: "'a multi_degree"

还有一句话:您可能要考虑使用multi_degreetypedef引入新类型,然后使用提升/转移定义您要在其上定义的所有功能。 (参见相应的手册)

这样做的好处是,您可以实例化正确的类型类(如comm_monoid_add),并且不必随时进行区域设置假设。此外,您可以撰写+0,而不是zero_degree