P l1 l2.
intros (T1 T2 l1 l2 P Hl Pnil Pcons);
generalize in match Hl; clear Hl; generalize in match l2; clear l2;
P l1 l2.
intros (T1 T2 l1 l2 P Hl Pnil Pcons);
generalize in match Hl; clear Hl; generalize in match l2; clear l2;
qed.
lemma eq_map : ∀A,B,f,g,l. (∀x.f x = g x) → map A B f l = map A B g l.
qed.
lemma eq_map : ∀A,B,f,g,l. (∀x.f x = g x) → map A B f l = map A B g l.
lcmp ? l1 l2 = true → length ? l1 = length ? l2.
intros 2 (d l1); elim l1 1 (l2 x1);
[1: cases l2; simplify; intros; [reflexivity|destruct H]
lcmp ? l1 l2 = true → length ? l1 = length ? l2.
intros 2 (d l1); elim l1 1 (l2 x1);
[1: cases l2; simplify; intros; [reflexivity|destruct H]
simplify; (* XXX la apply non fa simplify? *)
apply congr_S; apply (IH l);
(* XXX qualcosa di enorme e' rotto! la regola di convertibilita?! *)
simplify; (* XXX la apply non fa simplify? *)
apply congr_S; apply (IH l);
(* XXX qualcosa di enorme e' rotto! la regola di convertibilita?! *)
rewrite > (IH H2); rewrite > (b2pT ? ? (eqP d ? ?) H1); reflexivity
| generalize in match H; clear H; generalize in match l2; clear l2;
elim l1 1 (l1 x1);
rewrite > (IH H2); rewrite > (b2pT ? ? (eqP d ? ?) H1); reflexivity
| generalize in match H; clear H; generalize in match l2; clear l2;
elim l1 1 (l1 x1);
| intros 3 (tl1 IH l2); cases l2;
[ unfold Not; intros; destruct H1;
| simplify; intros;
cases (b2pT ? ? (andbPF ? ?) (p2bT ? ? (negbP ?) H)); clear H;
[ intros; lapply (b2pF ? ? (eqP d ? ?) H1) as H'; clear H1;
| intros 3 (tl1 IH l2); cases l2;
[ unfold Not; intros; destruct H1;
| simplify; intros;
cases (b2pT ? ? (andbPF ? ?) (p2bT ? ? (negbP ?) H)); clear H;
[ intros; lapply (b2pF ? ? (eqP d ? ?) H1) as H'; clear H1;