Isabelle 伊莎贝尔:将引理调整为“rule”方法所需的形式

Isabelle 伊莎贝尔:将引理调整为“rule”方法所需的形式,isabelle,Isabelle,我定义了一个称为步骤的归纳关系。以下是推理规则之一: 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:

我定义了一个称为
步骤的归纳关系。以下是推理规则之一:

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)
现在,当我调用
规则G_No_Op_helper
时,“两个γ必须匹配”这一要求就变成了有待证明的子目标

G_No_Op
转换为
G_No_Op_helper
看起来相当机械。我的问题是:有没有办法让伊莎贝尔自动做到这一点


编辑。我想出了一个“最小工作示例”。在下文中,引理
A
相当于
A2
,但是
规则A
无助于证明定理,只有
规则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)
consts foo::“nat⇒ 纳特⇒ 纳特⇒ “布尔”
引理A:x
据我所知,没有任何东西可以使这些事情自动化。可以将其实现为一个属性,即

thm A[generalised x]
获得类似A2的东西。该属性将替换给定变量的每次出现(即此处的
x
),但定理结论中的第一个变量将替换为新变量
x'
,并将前提
x'=x
添加到定理中


对于比我更精通Isabelle/ML的人来说,这应该不难实现——也许读过这篇文章的一些高级Isabelle/ML黑客会对这一想法发表评论。

据我所知,没有任何东西可以实现这些事情的自动化。可以将其实现为一个属性,即

thm A[generalised x]
获得类似A2的东西。该属性将替换给定变量的每次出现(即此处的
x
),但定理结论中的第一个变量将替换为新变量
x'
,并将前提
x'=x
添加到定理中


对于比我更精通Isabelle/ML的人来说,这应该不难实现——也许读过这篇文章的一些高级Isabelle/ML黑客可以对这一想法发表评论。

有一个众所周知的原则“定义证明”,即,您编写初始规范的方式使生成的规则易于应用。非正式读者有时可能会对此感到意外,但对于形式主义者来说这是正常的。

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

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

theorem "foo y x z"
  apply (fuzzy_rule A)
  subgoal "x < y" 
    sorry
  subgoal "x = z"
    sorry
定理“foo y x z”
应用(模糊规则A)
子目标“x

代码可以在

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

theorem "foo y x z"
  apply (fuzzy_rule A)
  subgoal "x < y" 
    sorry
  subgoal "x = z"
    sorry
定理“foo y x z”
应用(模糊规则A)
子目标“x

该代码可在

Intersting获得;我以前也遇到过类似的问题。A“匹配这条规则,该死,把所有失败的统一作为子目标给我!”!“有时可能会很方便。我怀疑这可能会有问题,因为可能有许多不同的可能性来添加方程,以使某些东西统一起来。但我不确定。有趣的是,我以前也遇到过类似的问题。A“匹配这条规则,该死的,把所有失败的统一作为子目标给我!”!“有时可能很方便。我怀疑这可能会有问题,因为可能有许多不同的可能性来添加方程式,以使某些东西统一起来。但我不确定。