如何证明关于对列表的定理

How to prove theorem about list of pairs

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

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).

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

如果你使用 inversion H 而不是 injection Hsubst 而不是用等式重写(subst 取任何等式 v = expr 其中 v 是一个变量,到处用 expr 代替 v;然后清除变量 v).

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

H0 : (a :: l, b :: l0) = (y, z)
============================
length y = length z

此时应该很明显,yz是一些非空列表。所以 injection H0.(或 Tej Chajed 建议的 inversion H0.)可以帮助你解决这个问题。

那你可以把目标改成

length l = length l0

结合使用简化和重写(这取决于您使用的确切策略,inversion 使它更简单)。您可能还会发现 f_equal 策略非常有用。此时您几乎完成了,因为您现在可以使用您的归纳假设。