我定义了一个名为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)
答案 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