在Coq中证明“rev(rev l)= l”

时间:2016-03-09 15:15:40

标签: coq induction

这是给我的练习之一,我在对l进行归纳后几乎立即卡住了。我不知道在这里做什么其他断言。

我不允许使用像汽车,直觉等高级战术。

Fixpoint snoc {A : Type} l a : list A :=

match l with

  | nil    => a :: nil

  | h :: t => h :: (snoc t a)

end.

Fixpoint rev {A : Type} l : list A :=

match l with

  | nil    => nil

  | h :: t => snoc (rev t) h

end.

(Prove the following)

Theorem rev_rev : forall A (l : list A),

rev (rev l) = l.

2 个答案:

答案 0 :(得分:4)

我们对这一切都很陌生,一开始,在尝试掌握一门新课程时,获得帮助是不会有失去勇气的。我会尝试给你一个提示而不会放弃太多。

这比之前的练习更棘手的原因可能是因为这个证据涉及做两个归纳推理步骤。你可能做了第一个就好了,得到了第二个目标,如

  ...
  IHl : rev (rev l) = l
  ============================
   rev (snoc (rev l) a) = a :: l

很遗憾,您无法立即使用归纳假设IHl,因为rev的参数形状不正确。

所以,在这里你可以尝试证明关于rev (snoc l a) = ...的另一个引理,它将把目标变成你可以用IHl重写的东西。
如果你能弄清楚这一点,并证明在引理中,那么你应该没事。

答案 1 :(得分:1)

我们不会为你做功课,你应该首先在笔和笔上证明它。 @gallais说道。

提示:您可能需要稍微概括一下您的属性(使用中间引理)才能证明rev_rev。你应该看看rev_append