伊莎贝尔中“∀r>0”的介绍规则

Intro rule for "∀r>0" in Isabelle

当我有一个像伊莎贝尔"∀x. P x"这样的目标时,我知道我可以写

show "∀x. P x"
proof (rule allI)

但是,当目标是 "∀x>0. P x" 时,我不能那样做。我可以在 proof 之后使用类似的 rule/method 来简化我的目标吗?如果您有 "∃x>0. P x".

形式的目标,我也会对其中一个感兴趣

我正在寻找使用 proof (rule something) 样式的 Isar 证明。

Isabelle2016-1-RC2以下作品:

lemma "∀ x>0. P x"
  apply (rule allI)

一般情况下,您也可以只使用apply rule,这将select默认引入规则。存在量词也是如此。

全称量词

扩展 Lars 的回答:∀x>0. P x 只是 ∀x. x > 0 ⟶ P x 的语法糖。因此,如果你想证明这样的命题,你首先必须用 allI 去掉全称量词,然后用 impI 去掉蕴涵。你可以这样做:

lemma "∀x>0. P x"
proof (rule allI, rule impI)

或使用 intro,这或多或少与应用 rule 相同,直到不再可能为止:

lemma "∀x>0. P x"
proof (intro allI impI)

或者您可以使用 safe,它会急切地应用所有声明为“安全”的引入规则,例如 allIimpI:

lemma "∀x>0. P x"
proof safe

无论如何,你的新证明状态是

proof (state)
goal (1 subgoal):
 1. ⋀x. 0 < x ⟹ P x

您可以这样进行:

lemma "∀x>0. P (x :: nat)"
proof safe
  fix x :: nat assume "x > 0"
  show "P x"

请注意,我添加了注释;我不知道你的 P 是什么类型,所以我只使用了 nat。当您在 Isar 中修复一个变量并且类型从假设中不明确时,您将收到一个警告,指出引入了一个新的自由类型变量,这不是您想要的。当您收到该警告时,您应该像我上面所做的那样向 fix 添加类型注释。

存在量词

对于存在量词,safe 将不起作用,因为介绍规则 exI 由于技术原因并不总是安全的。 ∃x>0. P x 的典型证明模式类似于:

lemma "∃x>0. P (x :: nat)"
proof -
  have "42 > (0 :: nat)" by simp
  moreover have "P 42" sorry
  ultimately show ?thesis by blast
qed

或者更明确一点:

lemma "∃x>0. P (x :: nat)"
proof -
  have "42 > 0 ∧ P 42" sorry
  thus ?thesis by (rule exI)
qed

如果存在见证(即本例中的 42)不依赖于您从 obtain 命令中获得的任何变量,您也可以更直接地进行:

lemma "∃x>0. P (x :: nat)"
proof (intro exI conjI)

您的目标是 ?x > 0P ?x。请注意,?x 是一个示意图变量,您可以为其放置任何内容。所以你可以这样完成证明:

lemma "∃x>0. P (x :: nat)"
proof (intro exI conjI)
  show "42 > (0::nat)" by simp
  show "P 42" sorry
qed

正如我所说,如果您的存在见证取决于您由于技术限制从 obtain 获得的某些变量,这 不会 起作用。在那种情况下,您必须退回到我提到的其他解决方案。