Coq 如何证明偶表定理

Coq 如何证明偶表定理,coq,coq-tactic,Coq,Coq Tactic,我试图继续证明这是一个关于配对的列表,但这似乎是不可能的。我应该如何继续解这个定理 Require Import List. Fixpoint split (A B:Set)(x:list (A*B)) : (list A)*(list B) := match x with |nil => (nil, nil) |cons (a,b) x1 => let (ta, tb) := split A B x1 in (a::ta, b::tb) end. Theorem

我试图继续证明这是一个关于配对的列表,但这似乎是不可能的。我应该如何继续解这个定理

Require Import List.

Fixpoint split (A B:Set)(x:list (A*B)) : (list A)*(list B) :=
 match x with
   |nil => (nil, nil)
   |cons (a,b) x1 => let (ta, tb) := split A B x1 in (a::ta, b::tb)
 end.

Theorem split_eq_len : 
forall (A B:Set)(x:list (A*B))(y:list A)(z:list B),(split A B x)=(y,z) -> 
length y = length z.
Proof.
intros A B x.
elim x.
simpl.
intros y z.
intros H.
injection H.
intros H1 H2.
rewrite <- H1.
rewrite <- H2.
reflexivity.
intros hx.
elim hx.
intros a b tx H y z.
simpl.
intro.
destruct (split A B tx).

我不想只是给你一个证据,但这里有一个提示:


如果您使用反转H而不是注入H,并且subst而不是使用等式重写,那么您的证明将更简单。subst接受任何等式v=expr,其中v是一个变量,并在任何地方用expr替换v;然后它会清除变量v。

让我向您展示几个步骤,您可以采取这些步骤来推进您的证明。 您最终处于这种证明状态:

H0 : (a :: l, b :: l0) = (y, z)
============================
length y = length z
此时,很明显y和z是一些非空列表。所以注射H0。或倒置H0。正如Tej Chajed所建议的那样,他可以帮助你解决这个问题

然后你可以把你的目标变成

length l = length l0

使用简化和重写的组合取决于您使用的确切策略,反转使其更简单。你也可能会发现f_equal策略非常有用。至此,您几乎完成了,因为您现在可以使用归纳假设了。

谢谢您,Tej,但您的提示只是关于证明的第一个案例,即nil案例,其证明非常简单。我需要第二种情况的提示,归纳步骤。@Amir-你的代码中没有归纳步骤,因为你在任何地方都没有做归纳,这就是这个答案建议你做的。@Lee elim介绍了归纳假设。所以,在这个公式中,这是完全可以证明的。你是对的@AntonTrunov,我不知道elim到底做了什么。安东:请注意这个问题,我在问如何继续这个问题。在你提到的URL中,最后一个建议是使用destruct split A B tx,但对于如何完全完成证明没有其他想法。我收回了我的投票,因为你编辑了你的帖子,澄清了你的确切问题。提及你的原始资料总是一个好主意,以表示你对原始证明尝试的作者的赞赏,并防止可能的混淆。谢谢,享受定理证明!这很有帮助。你很专业。我很感激。