Isabelle 重新安排目标(伊莎贝尔)

Isabelle 重新安排目标(伊莎贝尔),isabelle,isar,Isabelle,Isar,我想知道在以下情况下如何重新安排目标: lemma "P=Q" proof (rule iffI, (*here I would like to swap goal order*), rule ccontr) oops 我想要一个不需要改变引理语句的解决方案。我意识到,首选和延迟可用于应用样式的校对,但我希望有一种方法可用于校对(…)部分 编辑: 正如Andreas Lochbihler所说,在上面的示例中,编写规则iffI[旋转]是有效的。然而,在下面的情况下,在不改变引理的陈述的情况下

我想知道在以下情况下如何重新安排目标:

lemma "P=Q"
  proof (rule iffI, (*here I would like to swap goal order*), rule ccontr)
oops
我想要一个不需要改变引理语句的解决方案。我意识到,
首选
延迟
可用于应用样式的校对,但我希望有一种方法可用于
校对(…)
部分

编辑:

正如Andreas Lochbihler所说,在上面的示例中,编写
规则iffI[旋转]
是有效的。然而,在下面的情况下,在不改变引理的陈述的情况下交换目标顺序是可能的吗

lemma "P==>Q" "Q==>P"
  proof ((*here I would like to swap goal order*), rule ccontr)
oops

这个例子似乎是人为的,但我觉得在某些情况下,改变引理的陈述是不方便的,或者,如果以前没有应用诸如
iffI

之类的规则,则有必要交换目标顺序。子目标的顺序由应用规则的假设顺序决定。因此,交换
iffI
规则的假设就足够了,例如,使用属性
[rotated]
,如中所示

proof(rule iffI[rotated], rule ccontr)
一般来说,没有证明方法来改变目标的顺序。如果您正在考虑将其用于更复杂的自动化验证,如
auto
,我强烈建议您不要做这些事情。具有大量自动化的证明脚本应该独立于目标的顺序工作。否则,当校样自动化设置中的某些内容发生更改时,校样将很容易损坏

然而,一些低级验证策略允许使用明确的目标寻址(主要是那些以
\u tac
结尾的)。比如说,

proof(rule iffI, rule_tac [2] ccontr)

ccontr
规则应用于第二个子目标,而不是第一个子目标。

这非常有用。然而,你知道一个更一般的方法吗:我将在我的问题中添加一个例子,解释为什么
rotated
可能不够一般。我相应地更改了我的答案。有一种方法可以在方法表达式中重新排序子目标。原则上,您可以实现自己的证明方法。