首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何引用Isar中的当前子目标?

如何引用Isar中的当前子目标?
EN

Stack Overflow用户
提问于 2017-03-03 23:49:31
回答 1查看 238关注 0票数 0

我正在尝试解决Programming and Proving in Isabelle中的练习4.7。我遇到了一个案例,在这个案例中,我证明了错误,因此证明了一切,但我不能结案,因为我不知道如何引用我的证明义务。

代码语言:javascript
复制
theory ProgProveEx47
  imports Main
begin

datatype alpha = a | b | c

inductive S :: "alpha list ⇒ bool" where
  Nil: "S []" |
  Grow: "S xs ⟹ S ([a]@xs@[b])" |
  Append: "S xs ⟹ S ys ⟹ S (xs@ys)"

fun balanced :: "nat ⇒ alpha list ⇒ bool" where
  "balanced 0 [] = True" |
  "balanced (Suc n) (b#xs) = balanced n xs" |
  "balanced n (a#xs) = balanced (Suc n) xs" |
  "balanced _ _ = False"

lemma
  fixes n xs
  assumes b: "balanced n xs"
  shows "S (replicate n a @ xs)"
proof -
  from b show ?thesis
  proof (induction xs)
    case Nil
    hence "S (replicate n a)"
    proof (induction n)
      case 0
      show ?case using S.Nil by simp
      case (Suc n)
      value ?case
      from `balanced (Suc n) []` have False by simp
      (* thus "S (replicate (Suc n) a)" by simp *)
      (* thus ?case by simp *)
      then show "⋀n. (balanced n [] ⟹ S (replicate n a)) ⟹ balanced (Suc n) [] ⟹ S (replicate (Suc n) a)" by simp

最后一个show之后的命题是从Isabelle/jedit中的证明状态复制过来的。但是,Isabelle报告了错误(在最后一个show):

代码语言:javascript
复制
   Failed to refine any pending goal 
Local statement fails to refine any pending goal
Failed attempt to solve goal by exported rule:
  (balanced 0 []) ⟹
  (balanced ?na3 [] ⟹ S (replicate ?na3 a)) ⟹
  (balanced (Suc ?na3) []) ⟹
  (balanced ?n [] ⟹ S (replicate ?n a)) ⟹
  (balanced (Suc ?n) []) ⟹ S (replicate (Suc ?n) a)

现在注释掉的证明目标导致了同样的错误。如果我将案例替换为0Suc,则错误出现在0案例的最后一个show中,但不再出现在Suc案例中。

有人能解释一下为什么伊莎贝尔不会接受这些看似正确的目标吗?我如何以Isabelle可以接受的方式陈述子目标?有没有引用当前子目标的一般方法?我认为考虑到我使用的构造,?case应该能完成这项工作,但很明显它不能。

我发现this堆栈溢出问题提到了相同的错误,但问题不同(定理存在等价性,应该通过rule的隐式应用将其拆分为方向子目标),在我的情况下,应用所提供的解决方案会导致不正确和不可证明的目标。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-04 05:09:15

你只是在内部归纳证明中遗漏了一个next

代码语言:javascript
复制
lemma
  fixes n xs
  assumes b: "balanced n xs"
  shows "S (replicate n a @ xs)"
proof -
  from b show ?thesis
  proof (induction xs)
    case Nil
    hence "S (replicate n a)"
    proof (induction n)
      case 0
      show ?case using S.Nil by simp
    next (* this next was missing *)
      case (Suc n)
      show ?case sorry
    qed
    show ?case sorry
  next
    case (Cons a xs)
    then show ?case sorry
  qed
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42583142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档