Isabelle - 需要 exI 和 refl 行为解释

Isabelle - exI and refl behavior explanation needed

我试图理解下面的引理。

lemma "∀x. ∃y. x = y"   
  apply(rule allI)     (*  ⋀x.      ∃y. x = y *)
  thm exI              (*  ?P ?x ⟹ ∃x. ?P x  *)
  apply(rule exI)      (*  ⋀x. x = ?y2 x      *)
  thm refl             (*  ?t = ?t            *)   
  apply(rule refl)   
done

UPDATE(因为我无法在注释中格式化代码):

这是相同的引理,但使用了 simp 进行了不同的证明。

lemma "∀x. ∃y. x = y"
  using [[simp_trace, simp_trace_depth_limit = 20]]
  apply (rule allI)  (*So that we start from the same problem state. *)   
  apply (simp only:exI) 
done

轨迹显示:

[0]Adding rewrite rule "HOL.exI":
?P1 ?x1 ⟹ ∃x. ?P1 x ≡ True 
[1]SIMPLIFIER INVOKED ON THE FOLLOWING TERM:
⋀x. ∃y. x = y 
[1]Applying instance of rewrite rule "HOL.exI":
?P1 ?x1 ⟹ ∃x. ?P1 x ≡ True    
[1]Trying to rewrite:
x = ?x1 ⟹ ∃xa. x = xa ≡ True   <-- NOTE: not ?y2 xa or similar!
[2]SIMPLIFIER INVOKED ON THE FOLLOWING TERM:
x = ?x1 
[1]SUCCEEDED
∃xa. x = xa ≡ True

显然 simprule 处理 exI 的方式不同。剩下的问题是:rule 行为背后的机械(程序)推理是什么。

当您对某些事实thm使用rule thm时,伊莎贝尔对thm的结论与当前目标进行高阶统一。如果有统一符,则用它来实例化目标和定理的结论,然后进行解析(即用thm的假设代替目标)。

这意味着:

  1. 目标中的原理图变量可以通过rule统一实例化

  2. 仅出现在thm假设中的变量不会被统一实例化,因此将保持示意图。这样,您最终会在新目标中得到示意图变量。这样的变量在某种意义上可以看作是存在,因为如果你能证明只有一个的假设,thm的结论就成立任意值。

exI 的情况下,您有 ?P ?x ⟹ ∃x. ?P x。当你应用rule exI时,变量?P被实例化为λy. x = y,但是变量?x只出现在exI的假设中,所以它仍然是示意图。这意味着您可以在稍后的证明中为 ?x 选择任何您想要的值。

更准确地说,您最终以 ⋀x. x = ?y2 x 作为目标。你可能会问“为什么不只是 ⋀x. x = ?y2?”这意味着你必须证明 x 等于某个固定值 y2 对于 所有 可能x 的值。这显然不是一般情况。 ⋀x. x = ?y2 x 意味着你必须证明每个 x 等于一些可能依赖于 xy2 – 或者,等价地,有一个函数 y2 那,当给定 x 时,输出 x.

当然还有这样的函数,就是恒等函数λx. x。这正是当你应用 rule refl?y2 被实例化的目标:目标 x = ?y2 x 与 refl ?t = ?t 的结论统一并且你最终得到 ?t = x?y2 = λx. x,并且由于 refl 没有假设,这个决议完成了证明。

我不完全确定你所说的“为什么 refl 中没有考虑它?”是什么意思,但我希望我已经回答了你的问题。

从专家那里得到更完整的答案,但我对你的第二部分给出了简短的回答。

Isabelle 的伟大之处在于它提供了许多不同的方法来证明一个问题。

您的新问题类似于 L.Paulson 对 FOM 的评论:您通过将问题切换为 rulesimp 来移动目标 post:

http://www.cs.nyu.edu/pipermail/fom/2015-October/019312.html

simp 有一个基本的了解实际上是一个更容易追求的目标,否则我不会在这里添加我的回复。

rule和自然推演

rule 的使用是自然推导 (ND) 的使用,大多数人在 ND 上都跟不上速度。 ND的使用需要理解ND,所以像你的第一个问题这样的问题可能会导致一个不简单的答案,因为任何信息性的东西都不能成为一个线性答案,尤其是由于事情比如原理图变量(你问过的)、分辨率、统一、重写等。

搜索自然演绎法,您会找到关于它的标准维基页面。有很多关于自然演绎的书籍,尽管由于一阶逻辑书籍,它们在 "logic" 上的搜索中被淹没了。一本受欢迎的书是 计算机科学中的逻辑,第 2 本书,作者是 Huth 和 Ryan。

如果你研究 ND,你会发现 exI 符合 ND 规则之一。

我还没有花时间来加快 ND 的速度,因为我一直在进步,但对 ND 的了解并不多。

Sledgehammer 和自动方法 autosimpblastinductcases 等,以及 Sledgehammer 使用的一些那些,使我无法找到时间以自然的方式变得更好。

答案和 M.Eberl 一样,虽然不是简单的解释,但帮助我在​​这里吸收一点,那里吸收一点。

Simp,我认为是简单的替换(重写)

simp 背后的机制非常简单,与自然演绎相比。你定义一个公式并证明它:

lemma foo [simp]: "left_hand_side = right_hand_side"

在另一个定理的证明中,当simp这样或那样调用时,或者foo展开时,有left_hand_side的地方被[=26代替了=].这只是经典的数学替换。

我想它也可能是 "rewriting",但我对重写一无所知,除了他们谈论它。

有很多关于如何以及是否应该自动设置(以防止循环)的细节,比如 [simp]declare foo_def [simp add],但这只是正常编程的细节.