我有一些任务要做,但不知道该怎么做:
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。我可以用一些例子来做,但我认为那不是专业的
答案 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.