我有
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处存在一个微不足道的剩余子目标。
为什么会发生这种情况,我该如何解决?
答案 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
语句失败优化任何待定目标,您将无法继续。