Isabelle:调整引理以形成`rule`方法所需的形式

时间:2014-01-25 11:31:55

标签: isabelle

我定义了一个名为step_g的归纳关系。这是推理规则之一:

G_No_Op:
  "∀j ∈ the (T i). ¬ (eval_bool p (the (γ ⇩t⇩s j)))
  ⟹ step_g a i T (γ, (Barrier, p)) (Some γ)"

我想在证明中调用此规则,因此我输入

apply (rule step_g.G_No_Op)

但是规则不能应用,因为它的结论必须是特定的形式(两个γ必须匹配)。所以我像这样调整规则:

lemma G_No_Op_helper:
  "⟦ ∀j ∈ the (T i). ¬ (eval_bool p (the (γ ⇩t⇩s j))) ; γ = γ' ⟧
  ⟹ step_g a i T (γ, (Barrier, p)) (Some γ')"
by (simp add: step_g.G_No_Op)

现在,当我调用rule G_No_Op_helper时,“两个γ必须匹配”的要求成为要证明的子目标。

G_No_Op转换为G_No_Op_helper看起来相当机械。我的问题是:有没有办法让Isabelle自动执行此操作?


编辑。我想出了一个“最小的工作示例”。在下文中,引理A等同于A2,但rule A无助于证明该定理,只有rule A2有效。

consts foo :: "nat ⇒ nat ⇒ nat ⇒ bool"

lemma A: "x < y ⟹ foo y x x"
sorry

lemma A2: "⟦ x < y ; x = z ⟧ ⟹ foo y x z"
sorry

theorem "foo y x z"
apply (rule A)

3 个答案:

答案 0 :(得分:2)

据我所知,没有任何东西可以自动化这些东西。人们可以将其作为属性来实现,即

thm A[generalised x]

获得类似A2的东西。该属性将替换它所给出的变量的每个出现(即x这里),但是定理结论中的​​第一个带有新变量x'并将前提x' = x添加到定理。

对于比Isabelle / ML更熟练的人来说,这应该不是很难实现 - 也许一些读过这篇文章的高级Isabelle / ML黑客可以评论这个想法。

答案 1 :(得分:2)

有一个众所周知的原则是“按定义证明”,即您以一种易于应用的结果规则的方式编写初始规范。对于非正式的读者来说,这可能偶尔会出乎意料,但对于形式主义者来说这是正常的。

答案 2 :(得分:0)

我遇到了类似的问题,并写了一个名为Fuzzy_rule的方法,可以这样使用:

theorem "foo y x z"
  apply (fuzzy_rule A)
  subgoal "x < y" 
    sorry
  subgoal "x = z"
    sorry

该代码位于https://github.com/peterzeller/isabelle_fuzzy_rule