Isabelle 为什么这个看似不正确的证明对伊莎贝尔来说是正确的?

Isabelle 为什么这个看似不正确的证明对伊莎贝尔来说是正确的?,isabelle,Isabelle,在将以下证据从Isabelle 2020的PDF教程复制到IDE(关于Cantor定理,即从集合到其幂集的函数不能是满射的)时,我在“from 1 have 2”行上打了一个错 ,因此该行现在显示为(使用错误的forall量词) 奇怪的是,示例中的原始证明和此更改的版本都有效。但是更改后的版本是不正确的,不是吗 我是否遗漏了什么,或者有人能解释一下更改后的版本(如下)是如何正确的吗 lemma "¬ surj (f :: 'a ⇒ 'a set)" proof assum

在将以下证据从Isabelle 2020的PDF教程复制到IDE(关于Cantor定理,即从集合到其幂集的函数不能是满射的)时,我在“from 1 have 2”行上打了一个错

,因此该行现在显示为(使用错误的forall量词)

奇怪的是,示例中的原始证明和此更改的版本都有效。但是更改后的版本是不正确的,不是吗

我是否遗漏了什么,或者有人能解释一下更改后的版本(如下)是如何正确的吗

lemma "¬ surj (f :: 'a ⇒ 'a set)"
proof
  assume 0: "surj f"
  from 0 have 1: "∀ A. ∃ a. A = f a" by(simp add: surj_def )
  from 1 have 2: "∀ a. {x. x ∉ f x} = f a" by blast
  from 2 show "False" by blast
qed
---更新---

为了帮助诊断问题,下面是我将鼠标放在“from 2 show…”行上时的输出。它提到了一条导出的规则,这似乎是要证明的定理。(我不记得自己导出了这个规则,除了可能在几次试验中意外地得到了正确的量词。)


我刚刚试着关闭Isabelle并重新打开相同的.your文件,得到了相同的结果。(如你所见,我对伊莎贝尔的环境还不熟悉)。当我输入正确的文本时,我是否将定理保存在某个地方?

您使用的是哪个伊莎贝尔版本?在地雷上,爆炸呼叫不会终止(几秒钟内),背景突出显示了这一点:


然而,伊莎贝尔是乐观的:它假设爆炸最终会终止(不会)。因此,将检查下一步(由于类型不是空的,所以该步骤保持不变):∀ a、 “那么”∃ a、 P a)。这可能会给您一种验证正在进行的印象,但事实并非如此。

请注意,还有一种批量构建模式,在这种模式下,当验证不起作用时,构建会更加明显(因为构建会失败,或者在这种情况下,无限期运行,或者直到内存耗尽)。谢谢。我刚刚为诊断添加了一些信息。如果将blast替换为“apply blast done”,会发生什么?“导出的规则”只表示“显示”对应于本地目标。
  from 1 have 2: "∀ a. {x. x ∉ f x} = f a" by blast
lemma "¬ surj (f :: 'a ⇒ 'a set)"
proof
  assume 0: "surj f"
  from 0 have 1: "∀ A. ∃ a. A = f a" by(simp add: surj_def )
  from 1 have 2: "∀ a. {x. x ∉ f x} = f a" by blast
  from 2 show "False" by blast
qed
show False 
Successful attempt to solve goal by exported rule:
  (surj f) ⟹ False 
proof (state)
this:
  False

goal:
No subgoals!