有没有一种方法可以命名和引用 Isabelle 应用脚本中的假设?

Is there a way to name and refer to a assumption in Isabelle apply-scripts?

Isabelle (2021) 中是否有任何方法可以参考旧应用样式证明中的假设?

特别是,我有兴趣在 OF 运算符中使用假设作为事实,这样我就可以(假设):

apply(rule R[OF assm1  assm4])

,其中assm1assm4应该是指当前证明状态下的第一个和第四个假设。

通常,我可以安排当前目标的假设,使 R[OF assm1 assm4] 与子目标相同。但是,我无法完成证明,因为我不知道如何引用 assm1 assm4 等。似乎只允许使用全局定理名称 OF.

我什至尝试在假设上使用 subgoal_tac 方法,但它似乎没有为事实命名的选项。

最后,我不得不使用自动脚本,例如simp,对于如此明显的事情来说,这有点不透明。顺便说一句,这是出于学习目的。我尝试设置 simp_trace,但仍然无法在不使用 simp.

的情况下复制效果

此外,

如果没有办法引用假设,这是战术的局限还是自然演绎的根本局限?(即[=14的重写风格是=] 与自然演绎不兼容?)

Isar 的重点是你可以命名假设...

第一个低级解决方案是使用 drule(或 frule 以保持假设)。

这是一个例子:

lemma
  assumes ‹⋀x y. P x ⟹ Q y ⟹ R z› ‹P x› ‹Q y›
  shows ‹R z›
  using assms(2-) apply -
  apply (drule assms(1))
  apply assumption
  apply assumption
  done

查看 Chapter 5 了解有关 destruction/elimination/intro 规则的详细信息。

第二种解法是subgoal:

lemma
  assumes ‹⋀x y. P x ⟹ Q y ⟹ R z› ‹P x› ‹Q y›
  shows ‹R z›
  using assms(2-) apply -
  subgoal premises p
    by (rule assms(1)[OF p])
  done

但是如果你有很深的嵌套,这会产生难以阅读的证据。

第三个也是最好的解决方案是使用 Isar 证明…

这是一个完全避免使用名称的版本:

lemma
  assumes ‹⋀x y. P x ⟹ Q y ⟹ R z› ‹P x› ‹Q y›
  shows ‹R z›
  using assms apply -
  apply (elim meta_allE[of _ x])
  apply (elim meta_allE[of _ y])
  apply (drule cut_rl)
   apply assumption  
  apply (drule cut_rl)
   apply assumption  
  apply assumption
  done

你可以看到这有多丑陋以及为什么你应该避免它。