我试图理解下面的引理。
?y2
中引入了exI
逻辑示意图变量? refl
(x = x
)中没有考虑它?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
更新(因为我无法在评论中格式化代码):
这是使用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
显然simp
和rule
处理exI
的方式不同。剩下的问题是:rule
行为背后的机械(程序)推理是什么。
答案 0 :(得分:4)
当您使用rule thm
表示事实thm
时,Isabelle会根据当前目标执行thm
结论的高阶统一。如果有一个统一者,它用于实例化定理的目标和结论,然后执行解决(即目标被thm
的假设所取代。)
这意味着:
目标中的原理图变量可以rule
通过统一实例化
仅在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
所有的可能值{ {1}}。一般来说,这显然不正确。 x
表示您必须证明每个⋀x. x = ?y2 x
等于某些可能取决于x
的{{1}} - 或者等效地,有一个函数y2
,在给定x
时,输出y2
。
当然,是这样的函数,它只是身份函数x
。这正是x
在您应用λx. x
时实例化的内容:目标?y2
与refl rule refl
的结论统一,最终得到x = ?y2 x
和?t = ?t
,由于?t = x
没有任何假设,因此该解决方案完成了证明。
我不完全确定你的意思'为什么?y2 = λx. x
不考虑?',但我希望我已经回答了你的问题。
答案 1 :(得分:2)
从专家那里得到更完整的答案,但我会简要回答你的第二部分。
Isabelle的伟大之处在于它提供了许多不同的方法来证明问题。
您的新问题类似于L.Paulson对FOM的评论:您通过将问题转换为rule
与simp
来移动了目标帖子:
http://www.cs.nyu.edu/pipermail/fom/2015-October/019312.html
基本了解simp
实际上是一个更容易追求的目标,或者我不会在这里添加我的回应。
rule
和自然演绎 rule
的使用是使用自然演绎(ND),其中大多数人都没有达到ND的速度。 ND的使用需要理解ND ,所以像你的第一个问题这样的问题会导致一个非简单的答案,因为任何信息都不能成为一个单行答案,特别是因为像原理图变量(你问过的),分辨率,统一,重写等。
搜索自然演绎,您将找到有关它的标准Wiki页面。有很多关于自然演绎的书籍,尽管它们在搜索&#34;逻辑&#34;由于一阶逻辑书籍。一本受欢迎的书是计算机科学中的逻辑,第2版,作者是Huth和Ryan。
如果你研究ND,你会发现exI
符合其中一条ND规则。
我还没有花时间来提高ND的速度,因为我不断对ND进行基本的了解,不断取得进步。
Sledgehammer,自动方法auto
,simp
,blast
,induct
,cases
等,以及Sledgehammer的使用其中一些,让我无法找到时间变得善于自然的行为。
像M.Eberl这样的回答,虽然不是简单的解释,但是帮助我在这里和那里稍微吸收一点。
与自然演绎相比,simp
背后的机制非常简单。您定义一个公式并证明它:
lemma foo [simp]: "left_hand_side = right_hand_side"
在另一个定理的证明中,当simp
以某种方式被调用,或foo
被展开时,left_hand_side
被取代,right_hand_side
被替换为[simp]
{1}}。它只是经典的数学替代。
我想它也可以重写&#34;但是除了他们谈论重写之外,我对改写一无所知。
有很多关于如何以及是否应该自动设置(以防止循环)的详细信息,例如declare foo_def [simp add]
或HomeDir
,但这只是详细信息。正常编程。