Isar结合证明

时间:2019-03-06 16:40:15

标签: isabelle isar

我正在尝试使用Isar证明一些东西;到目前为止,我已经达到了一个看起来像这样的目标:

(∀P Q. P ≠ Q ⟶ (∃!l. plmeets P l ∧ plmeets Q l)) ∧
(∀P l. ¬ plmeets P l ⟶ (∃!m. affine_plane_data.parallel plmeets l m ∧ plmeets P m)) ∧
(∃P Q. P ≠ Q ∧ (∃R. P ≠ R ∧ Q ≠ R ∧ ¬ affine_plane_data.collinear plmeets P Q R)) 

(这里plmeets是我定义的函数,其中plmeets P l是仿射平面中“点P位于线l上”的简写,但我认为这并不重要我的问题。)

此目标是三件事的结合。实际上,我已经证明了引理在我看来与这些事物非常接近。例如,我有

lemma four_points_a1: "P ≠ Q ⟹ ∃! l . plmeets P l ∧ plmeets Q l"

产生输出

theorem four_points_a1: ?P ≠ ?Q ⟹ ∃!l. plmeets ?P l ∧ plmeets ?Q l
您可以看到的

几乎正好是这三个联合项目中的第一个。 (我承认我的其他引理与其他两项不太完全匹配,但我会继续努力)。

我想说“由于引理four_points_a1,我们只剩下要证明的是item2 ∧ item3”,我很确定有办法做到这一点。但是看“编程和证明”这本书对我没有任何建议。我想在Isabelle(而不是Isar)中,我将应用conjI两次以将一个目标分成三个目标,然后解决第一个目标。

但是我看不到在Isar中如何做到这一点。

1 个答案:

答案 0 :(得分:1)

根据@xanonec:

  

我想我会两次使用conjI将一个目标分成三个目标,然后解决第一个目标。

可以在Isar证明中执行此操作。但是,最好使用证明方法介绍,而不是规则conjI的多个应用,即,您可以使用apply(intro conjI)将目标分为3个子目标。然后,您可以使用subgoal分别为每个子目标提供证明。但是,除非您提供整个应用程序,否则很难说是否存在更好的方法。


根据@John: 此过程实际起作用的语法是:

  proposition four_points_sufficient: "affine_plane plmeets"
    unfolding affine_plane_def
    apply (intro conjI)
    subgoal using four_points_a1 by blast

我尚不清楚“在Isar证明中可以[两次应用conjI”是可能的”,但也许我现在不需要知道。