大锤提供的证据策略不足

时间:2016-02-02 14:58:06

标签: isabelle isar

我有

theory Even
imports Main

begin

inductive
  structural_even :: "nat ⇒ bool"
where
  "structural_even 0"
| "structural_even n ⟹ structural_even (Suc(Suc n))"

fun
  computational_even :: "nat ⇒ bool"
where
  "computational_even 0 = True"
| "computational_even (Suc 0) = False"
| "computational_even (Suc(Suc n)) = computational_even n"


lemma "computational_even n ⟹ structural_even n"
proof (induct n rule: computational_even.induct)
 show "computational_even 0 ⟹ structural_even 0"
 by (metis structural_even.intros(1))
next

证明后我得到了

goal (3 subgoals):
 1. computational_even 0 ⟹ structural_even 0
 2. computational_even (Suc 0) ⟹ structural_even (Suc 0)
 3. ⋀n. (computational_even n ⟹ structural_even n) ⟹ computational_even (Suc (Suc n)) ⟹ structural_even (Suc (Suc n))

我从大锤那里得到了梅蒂斯的召唤

structural_even.intros(1)= structural_even 0

我得到了

show computational_even 0 ⟹ structural_even 0 
Successful attempt to solve goal by exported rule:
 computational_even 0 ⟹ structural_even 0 
proof (state): depth 0

然后。但是,接下来我得到了

goal (3 subgoals):
 1. computational_even 0 ⟹ computational_even 0
 2. computational_even (Suc 0) ⟹ structural_even (Suc 0)
 3. ⋀n. (computational_even n ⟹ structural_even n) ⟹ computational_even (Suc (Suc n)) ⟹ structural_even (Suc (Suc n))

因此,尽管系统表示"成功尝试通过导出规则来解决目标,但是在1处存在一个微不足道的剩余子目标。

为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:2)

Sledgehammer找到了正确的证明(尽管您可能想要使用simp)。事实上,你可以继续使用第二个和第三个子目标(在你证明它们之后将会减少到与#1类似的新子目标)并最终用qed完成证明。

问题在于伊莎贝尔如何处理假设。如果,如果您没有明确列出它们,则由用户来证明它们。如果

,这种效果更明确
show "computational_even 0 ⟹ structural_even 0"

替换为等效的

presume "computational_even 0"
show "structural_even 0"

您的证明表明,只要structural_even 0成立,computational_even 0就成立,但Isabelle"不知道"为什么后者是真的。因此,它为您提供了新的子目标,证明中所述的假设可以从子目标中所述的假设中得出。该子目标将由qed处理,并通过考虑假设来完成证明。

顺便说一句,这种情况的假设根本不需要,因为structural_even 0的定义是正确的。因此可以安全地删除该假设,只留下

show "structural_even 0"

此外,您可以使用presume指定任意假设,但您必须在以后证明它们。例如,您可以证明目标

presume "computational_even (Suc 0)"
show "structural_even 0"

然后你必须证明(假)目标computational_even 0 ⟹ computational_even (Suc 0)

为了将假设与目标前提统一起来,使用assume代替:

assume "computational_even 0"
show "structural_even 0"

在这种情况下,没有必要证明子目标的假设(这已经由assume的统一步骤完成)。因此,在完成子目标的证明之后,只剩下2个子目标将按预期保留。

作为免费奖励,当assume使用错误的假设时(例如,在之前的错误情况下,computational_even (Suc 0)),Isabelle会抱怨相应的show语句失败优化任何待定目标,您将无法继续。