Coq 规格化(规格化n)=规格化(n)

Coq 规格化(规格化n)=规格化(n),coq,Coq,我正在研究软件基础中的示例。在归纳部分,其中一个练习涉及创建一个规范化函数并证明它的某些方面 我能够找出大部分的部分,虽然有一个地方,我被卡住了关于证据 介绍我所指的这个练习,通过这篇文章,我能够找出如何解决这个练习 现在的问题是,如果我不决定在normalize函数声明中排除嵌套匹配,为什么我会陷入证明中呢。我陷入困境的部分是证明正规化的幂等性,或者 normalize (normalize n) = normalize (n) 为什么取出嵌套的匹配项并将其重新声明为一个新函数可以让事情正

我正在研究软件基础中的示例。在归纳部分,其中一个练习涉及创建一个规范化函数并证明它的某些方面

我能够找出大部分的部分,虽然有一个地方,我被卡住了关于证据

介绍我所指的这个练习,通过这篇文章,我能够找出如何解决这个练习

现在的问题是,如果我不决定在normalize函数声明中排除嵌套匹配,为什么我会陷入证明中呢。我陷入困境的部分是证明正规化的幂等性,或者

normalize (normalize n) = normalize (n)
为什么取出嵌套的匹配项并将其重新声明为一个新函数可以让事情正常工作? (在证明与此新函数相关的附加语句并将其规范化后)

我是否从根本上遗漏了Coq中的证明工作?或者有没有一种方法可以通过这个normalize声明来完成这个练习

Fixpoint normalize (n : bin): bin :=
match n with 
  |  Z => Z
  | B1b n' => B1b (normalize n')
  | B0b n' => match  (normalize(n')) with
              | Z => Z
              | n'' => B0b n'' 
              end
end.
相对于

Definition helper_norm (n:bin):bin :=
match  n with
  | Z => 
  | n'' => B0b n'' 
end.



Fixpoint normalize (n : bin): bin :=
match n with 
  |  Z => Z
  | B1b n' => B1b (normalize n')
  | B0b n' => helper_norm(normalize(n'))
end.

编辑
对于那些正在学习软件基础教程的人。知道如何简化一个假设可能是有用的,据我所知,本练习之前的章节没有提到如何做到这一点。否则,为了解决这个问题,练习将不得不进行因子分解……

这里似乎没有必要这样做。在复杂的情况下,你只需要
销毁
正确的东西,然后所有东西都会掉出来

Inductive bin : Type :=
| Zero : bin
| B0b : bin -> bin
| B1b : bin -> bin.

Fixpoint normalize (n : bin) : bin :=
  match n with
  | Zero => Zero
  | B0b n =>
    match normalize n with
    | Zero => Zero
    | n => B0b n
    end
  | B1b n => B1b (normalize n)
  end.

Theorem normalize_idem (n : bin) : normalize (normalize n) = normalize n.
Proof.
  induction n as [ | n rec | n rec]; simpl.
  - admit.
  - destruct (normalize n) as [ | n' | n']; simpl in *; admit.
  - admit.
Qed.

我认为一个定义不可能使任何已经不可能的事情成为可能。关于
helper_norm x
的任何引理都是正确的,并且对于
匹配x与| Z=>Z | n=>B0b n end
,都是可以证明的,因为这些表达式是可转换的。将证明分成几个部分可能更清晰或更容易理解(在本例中,我们将把
析构函数(normalize n)…
的一部分拉到一个新引理,在那里我们可能可以将
normalize n
推广到任何
n:bin
),但我认为你没有获得任何力量。此外,尽管底层的证明语言并不真正区分定义和展开,但策略直接与表达式的语法交互,因此更简洁的表达式意味着策略不太可能混淆(例如,尝试
rewrite…at…
ing一个变量的十几次出现,而当有问题的术语被存储到函数中时,可能只有一次).也许有一个我遗漏的例子,但将定义拆分成更小的定义并不是为了让更多的证明成为可能,而是为了让我们更容易理解正在发生的事情。

在什么时候你会陷入困境?当我证明normalize(normalize n)=normalize(n)时。我在对n应用归纳法后陷入困境。(使用第一块中给出的规格化定义时)您好,这就是我最初的想法,有一种内在的结构,可能在没有分解的情况下是无法表达的,但正如您所说,它们是可转换的。不管怎样,我尝试了您的代码,我有几个问题。为什么要使用“承认”这个词?这不是真的证明了它吗?当我尝试进行规范化ide的证明时m我得到警告”(in-proof normalize_idem):尝试用放弃的目标保存一个证明。如果这确实是您想要做的,请使用accepted代替Qed@nd2是的,我故意让它不完整,否则我会发布教科书问题的答案。我有完整的证据,所以我知道这是可能的,但你应该试着自己完成它,而不是让我告诉你。啊。天哪……我之前被卡住了,因为我无法通过打电话给si来简化假设mpl.在此之前不知道Simplin做了什么。现在一切都好了。必须学习战术。谢谢你的澄清。