证明reverse = rev

时间:2011-05-08 17:27:25

标签: haskell equivalent proof

我有一些任务要做,但不知道该怎么做:

reverse, rev :: [a] [a]

reverse [] = []
reverse (x:xs) = reverse xs ++ [x]

rev = aux [] where
    aux ys [] = ys
    aux ys (x:xs) = aux (x:ys) xs

“证明:reverse = rev”

我们将不胜感激。谢谢。

PS。我可以用一些例子来做,但我认为那不是专业的

4 个答案:

答案 0 :(得分:3)

你可以通过结构感应做出邋proof的证明,但是如果你想要一个正确处理底部的证据,它就不那么重要了。

答案 1 :(得分:2)

诱导。基本案例是微不足道的。诱导步骤不应该太难。

答案 2 :(得分:1)

我不会试图直接证明等价,而是为每个函数证明(使用归纳法)它实际上反转了列表。如果它们都反向列表,则它们是等效的。

证明草图:

我们想要证明rev适用于所有列表:

基本情况长度为0的列表: 证明rev []正确计算

归纳案例: 证明对于任何n,rev可以反转任何长度为n的列表,假设rev可以反转任何长度为n-1的列表

答案 3 :(得分:1)

由于任何列表反转函数只能在给定有限列表的情况下产生任何输出,我们可以将此代码转换为Coq(其中列表总是有限的)并在那里证明所需的语句(忽略底部)。

这个证明不是我自己的 - 它是标准库中的证明的略微修改版本。

Open Scope list_scope.

Require List.
Require Import FunctionalExtensionality.

Section equivalence.

  Variable A : Type.

  (* The reverse function is already defined in the standard library as List.rev. *)
  Notation reverse := (@List.rev A).

  Fixpoint aux (ys l2 : list A) :=
    match l2 with
      nil => ys
      | x :: xs => aux (x :: ys) xs
    end.

  Definition rev : list A -> list A
    := aux nil.

  Lemma aux_rev : forall l l', aux l' l = reverse l ++ l'.
  Proof.
    induction l; simpl; auto; intros.
    rewrite <- List.app_assoc; firstorder.
  Qed.

  Theorem both_equal : reverse = rev.
    extensionality xs.
    unfold rev.
    rewrite aux_rev.
    now rewrite List.app_nil_r.
  Qed.

End equivalence.