Isabelle 如何使用Isar中的基本命题规则来证明'A⟶;A∨;B`?

Isabelle 如何使用Isar中的基本命题规则来证明'A⟶;A∨;B`?,isabelle,isar,Isabelle,Isar,我想将这个证明转化为Isar作为ab练习(让我自己学习Isar),只使用命题逻辑中的基本自然推理规则(ND)(例如,notI,notE,impI,impE…等) 我可以在应用脚本中轻松完成: lemma very_simple0: "A ⟶ A ∨ B" apply (rule impI) (* A ⟹ A ∨ B *) thm disjI1 (* ?P ⟹ ?P ∨ ?Q *) apply (rule disjI1) (* A ⟹ A *) by assumption 但我的

我想将这个证明转化为Isar作为ab练习(让我自己学习Isar),只使用命题逻辑中的基本自然推理规则(ND)(例如,
notI
notE
impI
impE
…等)

我可以在应用脚本中轻松完成:

lemma very_simple0: "A ⟶ A ∨ B"
  apply (rule impI) (* A ⟹ A ∨ B *)
  thm disjI1 (* ?P ⟹ ?P ∨ ?Q *)
  apply (rule disjI1) (* A ⟹ A *)
  by assumption
但我的Isar验证尝试失败了:

lemma very_simple1: "A ⟶ A ∨ B"
proof (* TODO why/how does this introduce A by itself*)
  assume A (* probably not neccessary since Isabelle did impI by itself *)
  have "A ⟹ A" by disjI1
  show "A ⟹ A" by assumption
qed
我的主要错误是:

Undefined method: "disjI1"⌂
这对我来说似乎很神秘,因为规则在之前的应用脚本中运行得很好

我做错了什么


注意,这也会导致错误:

lemma very_simple2: "A ⟶ A ∨ B"
proof impI
  assume A (* probably not neccessary since Isabelle did impI by itself *)
  have "A ⟹ A" by disjI1
  show "A ⟹ A" by assumption
qed
与上述错误相同:

Undefined method: "impI"⌂
为什么?


编辑:

我了解到“方法”仍然需要工作
规则impI
metis etc
,但脚本仍然失败:

lemma very_simple1: "A ⟶ A ∨ B"
proof (rule impI)
  assume A (* probably not neccessary since Isabelle did impI by itself *)
  have "A ⟹ A" by (rule disjI1)
  show "A ⟹ A" by assumption
qed

编辑2:

lemma very_simple1: "A ⟶ A ∨ B"
proof (rule impI)
  have 0: "A ⟹ A ∨ B" by (rule disjI1)
  have 1: "A ⟹ A" by assumption
  from 1 show "True" by assumption
qed

我仍然无法完成证明。

你有几个问题

让我们考虑这个例子:

have "A ⟹ A" by (rule disjI1)
这是失败的,那么首先,定理disjI1到底是什么

thm disjI1
(* ?P ⟹ ?P ∨ ?Q *)
由于规则的工作方式,它尝试将目标“A”与?p匹配∨ ?“Q”,它失败了。现在,如果您的目标具有正确的形式:

have "A ⟹ A ∨ B" by (rule disjI1)
它起作用了

第二个问题:

 proof
默认情况下等同于“证明标准”,默认情况下应用某些定理。通常,您将使用“证明-”来应用任何定理

最后,让我们考虑你的例子

lemma very_simple1: "A ⟶ A ∨ B"
proof (rule impI)
在状态视图中,可以看到:

proof (state)
goal (1 subgoal):
 1. A ⟹ A ∨ B
这意味着Isar必须看起来像

lemma very_simple1: "A ⟶ A ∨ B"
proof (rule impI)
  assume ‹A›
  show ‹A ∨ B›
    sorry
qed
  assume A
  show "A \/ B"
show works的事实表明,证明块具有正确的形式

注意:这是一个重要的步骤,尤其是在开始的时候。总是从假设和表演开始。别再写别的了。如果显示不起作用,Isar证明(假设和显示)产生的结构与预期证明(可在状态面板中看到)不匹配

您可以从那里做任何您想做的事情(包括启动一个新的证明块),但是您不能在不更改应用的规则的情况下更改该结构

让我们完成这个证明。我们希望使用假设(因此我们添加一个
然后
)和规则来证明目标

lemma very_simple1: "A ⟶ A ∨ B"
proof (rule impI)
  assume ‹A›
  then show ‹A ∨ B›
    by (rule disjI1)
qed
总的来说,我认为你应该阅读报告的Isar部分

编辑: 最重要的问题是,您误解了Isar是什么:Isar不是在这里帮助您完成不同的证明步骤(例如证明“A==>A”)。这里是做一个正向证明:你从假设(这里是a)开始,然后得出结论。所以Isar证据看起来像

lemma very_simple1: "A ⟶ A ∨ B"
proof (rule impI)
  assume ‹A›
  show ‹A ∨ B›
    sorry
qed
  assume A
  show "A \/ B"

你永远不必在证明中重复假设A

您仍然需要编写
规则impI
,impI是不够的。注意“证明”等同于“证明标准”,并自动应用一个定理。@MathiasFleury`有“A”⟹ “根据(规则disjI1)`这仍然不起作用。为什么?因为disjI1不是你想要的定理<代码>拥有“A”⟹ “根据假设”
是可行的。我当然正在研究它,但我想用一个比他们给出的Cantor证明更简单的例子(只使用单步证明方法)。为什么我的证明尝试仍然不起作用?我把我的答案扩大了一点。此外,大多数Isabelle方法试图通过auto and co教授更自动化的风格。这是一件好事(也是你应该做的),但如果你只对使用
规则感兴趣,你也可以阅读教程第5节什么是“好事”?您提到学习使用
自动
co
了吗?我认为这些是做“真正的证明”的好方法,但我讨厌它们是黑匣子。我不知道他们在做什么,也不知道如何实现我自己的一个。我很好奇,你为什么要把
放在你的证明中?谢谢你的帮助。看来我一点也不了解Isar,特别是考虑到完成证明不需要“假设”命令/规则。也许使用他们的例子(康托的论点)并通读这一章是学习Isar的唯一切实可行的方法。谢谢你迄今为止的帮助,顺便说一句!