]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/matita/contribs/ng_assembly/common/list_utility_lemmas.ma
Release 0.5.9.
[helm.git] / helm / software / matita / contribs / ng_assembly / common / list_utility_lemmas.ma
index 0b849b1e407f6bbbd81bdf8211694da20e266282..da7c6158ef983f247bc56986c55aa3ecc33c02fa 100755 (executable)
@@ -16,7 +16,7 @@
 (*                          Progetto FreeScale                            *)
 (*                                                                        *)
 (*   Sviluppato da: Ing. Cosimo Oliboni, oliboni@cs.unibo.it              *)
-(*   Sviluppo: 2008-2010                                                  *)
+(*   Ultima modifica: 05/08/2009                                          *)
 (*                                                                        *)
 (* ********************************************************************** *)
 
@@ -32,7 +32,7 @@ nlemma symmetric_lenlist : ∀T.∀l1,l2:list T.len_list T l1 = len_list T l2 
  nelim l1;
  ##[ ##1: #l2; ncases l2; nnormalize;
           ##[ ##1: #H; napply refl_eq
-          ##| ##2: #h; #t; #H; ndestruct (*nelim (nat_destruct_0_S ? H)*)
+          ##| ##2: #h; #t; #H; nelim (nat_destruct_0_S ? H)
           ##]
  ##| ##2: #h; #l2; ncases l2; nnormalize;
           ##[ ##1: #H; #l; #H1; nrewrite < H1; napply refl_eq
@@ -41,131 +41,116 @@ nlemma symmetric_lenlist : ∀T.∀l1,l2:list T.len_list T l1 = len_list T l2 
  ##]
 nqed.
 
-nlemma symmetric_foldrightlist2_aux :
-∀T1,T2:Type.∀f:T1 → T1 → T2 → T2.
- (∀x,y,z.f x y z = f y x z) →
- (∀acc:T2.∀l1,l2:list T1.
-  ∀H1:(len_list T1 l1 = len_list T1 l2).
-  ∀H2:(len_list T1 l2 = len_list T1 l1).
-   (fold_right_list2 T1 T2 f acc l1 l2 H1 = fold_right_list2 T1 T2 f acc l2 l1 H2)).
- #T1; #T2; #f; #H; #acc; #l1;
+nlemma symmetric_foldrightlist2_aux
+ : ∀T1,T2:Type.∀f:T1 → T1 → T2 → T2.∀acc:T2.∀l1,l2:list T1.
+   ∀H1:len_list T1 l1 = len_list T1 l2.∀H2:len_list T1 l2 = len_list T1 l1.
+  (∀x,y,z.f x y z = f y x z) →
+  fold_right_list2 T1 T2 f acc l1 l2 H1 = fold_right_list2 T1 T2 f acc l2 l1 H2.
+ #T1; #T2; #f; #acc; #l1;
  nelim l1;
  ##[ ##1: #l2; ncases l2;
-          ##[ ##1: nnormalize; #H1; #H2; napply refl_eq
-          ##| ##2: #h; #l; #H1; #H2;
+          ##[ ##1: nnormalize; #H1; #H2; #H3; napply refl_eq
+          ##| ##2: #h; #l; #H1; #H2; #H3;
                    nchange in H1:(%) with (O = (S (len_list ? l)));
-                   ndestruct (*nelim (nat_destruct_0_S ? H1)*)
-          ##]
- ##| ##2: #h3; #l3; #H1; #l2; ncases l2;
-          ##[ ##1: #H2; #H3; nchange in H2:(%) with ((S (len_list ? l3)) = O);
-                   ndestruct (*nelim (nat_destruct_S_0 ? H1)*)
-          ##| ##2: #h4; #l4; #H2; #H3;
-                   nchange in H2:(%) with ((S (len_list ? l3)) = (S (len_list ? l4)));
-                   nchange in H3:(%) with ((S (len_list ? l4)) = (S (len_list ? l3)));
+                   nelim (nat_destruct_0_S ? H1)
+          ##]
+ ##| ##2: #h3; #l3; #H; #l2; ncases l2;
+          ##[ ##1: #H1; #H2; #H3; nchange in H1:(%) with ((S (len_list ? l3)) = O);
+                   nelim (nat_destruct_S_0 ? H1)
+          ##| ##2: #h4; #l4; #H1; #H2; #H3;
+                   nchange in H1:(%) with ((S (len_list ? l3)) = (S (len_list ? l4)));
+                   nchange in H2:(%) with ((S (len_list ? l4)) = (S (len_list ? l3)));
                    nchange with ((f h3 h4 (fold_right_list2 T1 T2 f acc l3 l4 (fold_right_list2_aux3 T1 h3 h4 l3 l4 ?))) =
                                  (f h4 h3 (fold_right_list2 T1 T2 f acc l4 l3 (fold_right_list2_aux3 T1 h4 h3 l4 l3 ?))));
-                   nrewrite < (H1 l4 (fold_right_list2_aux3 T1 h3 h4 l3 l4 H2) (fold_right_list2_aux3 T1 h4 h3 l4 l3 H3));
-                   nrewrite > (H h3 h4 (fold_right_list2 T1 T2 f acc l3 l4 ?));
+                   nrewrite < (H l4 (fold_right_list2_aux3 T1 h3 h4 l3 l4 H1) (fold_right_list2_aux3 T1 h4 h3 l4 l3 H2) H3);
+                   nrewrite > (H3 h3 h4 (fold_right_list2 T1 T2 f acc l3 l4 ?));
                    napply refl_eq
           ##]
  ##]
 nqed.
 
-nlemma symmetric_foldrightlist2 :
-∀T1,T2:Type.∀f:T1 → T1 → T2 → T2.
- (∀x,y,z.f x y z = f y x z) →
- (∀acc:T2.∀l1,l2:list T1.∀H:len_list T1 l1 = len_list T1 l2.
-   fold_right_list2 T1 T2 f acc l1 l2 H = fold_right_list2 T1 T2 f acc l2 l1 (symmetric_lenlist T1 l1 l2 H)).
- #T1; #T2; #f; #H; #acc; #l1; #l2; #H1;
- nrewrite > (symmetric_foldrightlist2_aux T1 T2 f H acc l1 l2 H1 (symmetric_lenlist T1 l1 l2 H1));
+nlemma symmetric_foldrightlist2
+ : ∀T1,T2:Type.∀f:T1 → T1 → T2 → T2.∀acc:T2.∀l1,l2:list T1.∀H:len_list T1 l1 = len_list T1 l2.
+  (∀x,y,z.f x y z = f y x z) →
+  fold_right_list2 T1 T2 f acc l1 l2 H = fold_right_list2 T1 T2 f acc l2 l1 (symmetric_lenlist T1 l1 l2 H).
+ #T1; #T2; #f; #acc; #l1; #l2; #H; #H1;
+ nrewrite > (symmetric_foldrightlist2_aux T1 T2 f acc l1 l2 H (symmetric_lenlist T1 l1 l2 H) H1);
  napply refl_eq.
 nqed.
 
-nlemma symmetric_bfoldrightlist2 :
-∀T1:Type.∀f:T1 → T1 → bool.
- (∀x,y.f x y = f y x) →
- (∀l1,l2:list T1.
-  bfold_right_list2 T1 f l1 l2 = bfold_right_list2 T1 f l2 l1).
- #T; #f; #H; #l1;
+nlemma symmetric_bfoldrightlist2
+ : ∀T1:Type.∀f:T1 → T1 → bool.∀l1,l2:list T1.
+  (∀x,y.f x y = f y x) →
+  bfold_right_list2 T1 f l1 l2 = bfold_right_list2 T1 f l2 l1.
+ #T; #f; #l1;
  nelim l1;
  ##[ ##1: #l2; ncases l2;
-          ##[ ##1: nnormalize; napply refl_eq
-          ##| ##2: #hh2; #ll2; nnormalize; napply refl_eq
+          ##[ ##1: #H; nnormalize; napply refl_eq
+          ##| ##2: #hh2; #ll2; #H; nnormalize; napply refl_eq
           ##]
- ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2;
-          ##[ ##1: nnormalize; napply refl_eq
-          ##| ##2: #hh2; #ll2; nnormalize;
-                   nrewrite > (H1 ll2);
-                   nrewrite > (H hh1 hh2);
+ ##| ##2: #hh1; #ll1; #H; #l2; ncases l2;
+          ##[ ##1: #H1; nnormalize; napply refl_eq
+          ##| ##2: #hh2; #ll2; #H1; nnormalize;
+                   nrewrite > (H ll2 H1);
+                   nrewrite > (H1 hh1 hh2);
                    napply refl_eq
           ##]
  ##]
 nqed.
 
-nlemma bfoldrightlist2_to_eq :
-∀T1:Type.∀f:T1 → T1 → bool.
- (∀x,y.(f x y = true → x = y)) →
- (∀l1,l2:list T1.
-  (bfold_right_list2 T1 f l1 l2 = true → l1 = l2)).
- #T; #f; #H; #l1;
+nlemma bfoldrightlist2_to_eq
+ : ∀T1:Type.∀f:T1 → T1 → bool.∀l1,l2:list T1.
+   (∀x,y.(f x y = true → x = y)) →
+   (bfold_right_list2 T1 f l1 l2 = true → l1 = l2).
+ #T; #f; #l1;
  nelim l1;
  ##[ ##1: #l2; ncases l2;
-          ##[ ##1: #H1; napply refl_eq
-          ##| ##2: #hh2; #ll2; nnormalize; #H1;
-                   ndestruct (*napply (bool_destruct … H1)*)
+          ##[ ##1: #H; #H1; napply refl_eq
+          ##| ##2: #hh2; #ll2; #H; nnormalize; #H1; napply (bool_destruct … H1)
           ##]
- ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2;
-          ##[ ##1: nnormalize; #H2;
-                   ndestruct (*napply (bool_destruct … H2)*)
-          ##| ##2: #hh2; #ll2; #H2;
+ ##| ##2: #hh1; #ll1; #H; #l2; ncases l2;
+          ##[ ##1: #H1; nnormalize; #H2; napply (bool_destruct … H2)
+          ##| ##2: #hh2; #ll2; #H1; #H2;
                    nchange in H2:(%) with (((f hh1 hh2)⊗(bfold_right_list2 T f ll1 ll2)) = true);
-                   nrewrite > (H hh1 hh2 (andb_true_true_l … H2));
-                   nrewrite > (H1 ll2 (andb_true_true_r … H2));
+                   nrewrite > (H1 hh1 hh2 (andb_true_true_l … H2));
+                   nrewrite > (H ll2 H1 (andb_true_true_r … H2));
                    napply refl_eq
           ##]
  ##]
 nqed.
 
-nlemma eq_to_bfoldrightlist2 :
-∀T1:Type.∀f:T1 → T1 → bool.
- (∀x,y.(x = y → f x y = true)) →
- (∀l1,l2:list T1.
-  (l1 = l2 → bfold_right_list2 T1 f l1 l2 = true)).
- #T; #f; #H; #l1;
+nlemma eq_to_bfoldrightlist2
+ : ∀T1:Type.∀f:T1 → T1 → bool.∀l1,l2:list T1.
+   (∀x,y.(x = y → f x y = true)) →
+   (l1 = l2 → bfold_right_list2 T1 f l1 l2 = true).
+ #T; #f; #l1;
  nelim l1;
  ##[ ##1: #l2; ncases l2;
-          ##[ ##1: #H1; nnormalize; napply refl_eq
-          ##| ##2: #hh2; #ll2; #H1;
-                   (* !!! ndestruct: assert false *)
-                   nelim (list_destruct_nil_cons ??? H1)
+          ##[ ##1: #H; #H1; nnormalize; napply refl_eq
+          ##| ##2: #hh2; #ll2; #H; #H1; nelim (list_destruct_nil_cons ??? H1)
           ##]
- ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2;
-          ##[ ##1: #H2;
-                   (* !!! ndestruct: assert false *)
-                   nelim (list_destruct_cons_nil ??? H2)
-          ##| ##2: #hh2; #ll2; #H2; nnormalize;
+ ##| ##2: #hh1; #ll1; #H; #l2; ncases l2;
+          ##[ ##1: #H1; #H2; nelim (list_destruct_cons_nil ??? H2)
+          ##| ##2: #hh2; #ll2; #H1; #H2; nnormalize;
                    nrewrite > (list_destruct_1 … H2);
-                   nrewrite > (H hh2 hh2 (refl_eq …));
+                   nrewrite > (H1 hh2 hh2 (refl_eq …));
                    nnormalize;
-                   nrewrite > (H1 ll2 (list_destruct_2 … H2));
+                   nrewrite > (H ll2 H1 (list_destruct_2 … H2));
                    napply refl_eq
           ##]
  ##]
 nqed.
 
-nlemma bfoldrightlist2_to_lenlist :
-∀T.∀f:T → T → bool.
- (∀l1,l2:list T.bfold_right_list2 T f l1 l2 = true → len_list T l1 = len_list T l2).
+nlemma bfoldrightlist2_to_lenlist
+ : ∀T.∀f:T → T → bool.∀l1,l2:list T.bfold_right_list2 T f l1 l2 = true → len_list T l1 = len_list T l2.
  #T; #f; #l1;
  nelim l1;
  ##[ ##1: #l2; ncases l2;
           ##[ ##1: nnormalize; #H; napply refl_eq
-          ##| ##2: nnormalize; #hh; #tt; #H;
-                   ndestruct (*napply (bool_destruct … H)*)
+          ##| ##2: nnormalize; #hh; #tt; #H; napply (bool_destruct … H)
           ##]
  ##| ##2: #hh; #tt; #H; #l2; ncases l2;
-          ##[ ##1: nnormalize; #H1;
-                   ndestruct (*napply (bool_destruct … H1)*)
+          ##[ ##1: nnormalize; #H1; napply (bool_destruct … H1)
           ##| ##2: #hh1; #tt1; #H1; nnormalize;
                    nrewrite > (H tt1 ?);
                    ##[ ##1: napply refl_eq
@@ -176,22 +161,16 @@ nlemma bfoldrightlist2_to_lenlist :
  ##]
 nqed.
 
-nlemma decidable_list :
-∀T.(∀x,y:T.decidable (x = y)) →
-   (∀x,y:list T.decidable (x = y)).
+nlemma decidable_list : ∀T.∀H:(Πx,y:T.decidable (x = y)).∀x,y:list T.decidable (x = y).
  #T; #H; #x; nelim x;
  ##[ ##1: #y; ncases y;
           ##[ ##1: nnormalize; napply (or2_intro1 (? = ?) (? ≠ ?) (refl_eq …))
           ##| ##2: #hh2; #tt2; nnormalize; napply (or2_intro2 (? = ?) (? ≠ ?) ?);
-                   nnormalize; #H1;
-                   (* !!! ndestruct: assert false *)
-                   napply (list_destruct_nil_cons T … H1)
+                   nnormalize; #H1; napply (list_destruct_nil_cons T … H1)
           ##]
  ##| ##2: #hh1; #tt1; #H1; #y; ncases y;
           ##[ ##1: nnormalize; napply (or2_intro2 (? = ?) (? ≠ ?) ?);
-                   nnormalize; #H2;
-                   (* !!! ndestruct: assert false *)
-                   napply (list_destruct_cons_nil T … H2)
+                   nnormalize; #H2; napply (list_destruct_cons_nil T … H2)
           ##| ##2: #hh2; #tt2; nnormalize; napply (or2_elim (hh1 = hh2) (hh1 ≠ hh2) ? (H …));
                    ##[ ##2: #H2; napply (or2_intro2 (? = ?) (? ≠ ?) ?);
                             nnormalize; #H3; napply (H2 (list_destruct_1 T … H3))
@@ -206,31 +185,25 @@ nlemma decidable_list :
  ##]
 nqed.
 
-nlemma nbfoldrightlist2_to_neq :
-∀T1:Type.∀f:T1 → T1 → bool.
- (∀x,y.(f x y = false → x ≠ y)) →
- (∀l1,l2:list T1.
-  (bfold_right_list2 T1 f l1 l2 = false → l1 ≠ l2)).
- #T; #f; #H; #l1;
+nlemma nbfoldrightlist2_to_neq
+ : ∀T1:Type.∀f:T1 → T1 → bool.∀l1,l2:list T1.
+   (∀x,y.(f x y = false → x ≠ y)) →
+   (bfold_right_list2 T1 f l1 l2 = false → l1 ≠ l2).
+ #T; #f; #l1;
  nelim l1;
  ##[ ##1: #l2; ncases l2;
-          ##[ ##1: nnormalize; #H1;
-                   ndestruct (*napply (bool_destruct … H1)*)
-          ##| ##2: #hh2; #ll2; #H1; nnormalize; #H2;
-                   (* !!! ndestruct: assert false *)
-                   napply (list_destruct_nil_cons T … H2)
+          ##[ ##1: #H; nnormalize; #H1; napply (bool_destruct … H1)
+          ##| ##2: #hh2; #ll2; #H; #H1; nnormalize; #H2; napply (list_destruct_nil_cons T … H2)
           ##]
- ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2;
-          ##[ ##1: #H2; nnormalize; #H3;
-                   (* !!! ndestruct: assert false *)
-                   napply (list_destruct_cons_nil T … H3)
-          ##| ##2: #hh2; #ll2; #H2; nnormalize; #H3;
+ ##| ##2: #hh1; #ll1; #H; #l2; ncases l2;
+          ##[ ##1: #H1; #H2; nnormalize; #H3; napply (list_destruct_cons_nil T … H3)
+          ##| ##2: #hh2; #ll2; #H1; #H2; nnormalize; #H3;
                    nchange in H2:(%) with (((f hh1 hh2)⊗(bfold_right_list2 T f ll1 ll2)) = false);
-                   napply (H1 ll2 ? (list_destruct_2 T … H3));
+                   napply (H ll2 H1 ? (list_destruct_2 T … H3));
                    napply (or2_elim ??? (andb_false2 … H2) );
                    ##[ ##1: #H4; napply (absurd (hh1 = hh2) …);
                             ##[ ##1: nrewrite > (list_destruct_1 T … H3); napply refl_eq
-                            ##| ##2: napply (H … H4)
+                            ##| ##2: napply (H1 … H4)
                             ##]
                    ##| ##2: #H4; napply H4
                    ##]
@@ -238,25 +211,19 @@ nlemma nbfoldrightlist2_to_neq :
  ##]
 nqed.
 
-nlemma list_destruct :
-∀T.(∀x,y:T.decidable (x = y)) →
-   (∀h1,h2:T.∀l1,l2:list T.
-    (h1::l1) ≠ (h2::l2) → h1 ≠ h2 ∨ l1 ≠ l2).
+nlemma list_destruct
+ : ∀T.∀H:(Πx,y:T.decidable (x = y)).∀h1,h2:T.∀l1,l2:list T.(h1::l1) ≠ (h2::l2) → h1 ≠ h2 ∨ l1 ≠ l2.
  #T; #H; #h1; #h2; #l1; nelim l1;
  ##[ ##1: #l2; ncases l2;
           ##[ ##1: #H1; napply (or2_intro1 (h1 ≠ h2) ([] ≠ []) …);
                    nnormalize; #H2; nrewrite > H2 in H1:(%);
                    nnormalize; #H1; napply (H1 (refl_eq …))
           ##| ##2: #hh2; #ll2; #H1; napply (or2_intro2 (h1 ≠ h2) ([] ≠ (hh2::ll2)) …);
-                   nnormalize; #H2;
-                   (* !!! ndestruct: assert false *)
-                   napply (list_destruct_nil_cons T … H2)
+                   nnormalize; #H2; napply (list_destruct_nil_cons T … H2)
           ##]
  ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2;
           ##[ ##1: #H2; napply (or2_intro2 (h1 ≠ h2) ((hh1::ll1) ≠ []) …);
-                   nnormalize; #H3;
-                   (* !!! ndestruct: assert false *)
-                   napply (list_destruct_cons_nil T … H3)
+                   nnormalize; #H3; napply (list_destruct_cons_nil T … H3)
           ##| ##2: #hh2; #ll2; #H2;     
                    napply (or2_elim (h1 = h2) (h1 ≠ h2) ? (H h1 h2) …);
                    ##[ ##2: #H3; napply (or2_intro1 (h1 ≠ h2) ((hh1::ll1) ≠ (hh2::ll2)) H3)
@@ -270,25 +237,24 @@ nlemma list_destruct :
  ##]
 nqed.
 
-nlemma neq_to_nbfoldrightlist2 :
-∀T:Type.∀f:T → T → bool.
- (∀x,y:T.decidable (x = y)) →
- (∀x,y.(x ≠ y → f x y = false)) →
- (∀l1,l2:list T.
-  (l1 ≠ l2 → bfold_right_list2 T f l1 l2 = false)).
- #T; #f; #H; #H1; #l1;
+nlemma neq_to_nbfoldrightlist2
+ : ∀T:Type.∀f:T → T → bool.∀l1,l2:list T.
+   (∀x,y:T.decidable (x = y)) →
+   (∀x,y.(x ≠ y → f x y = false)) →
+   (l1 ≠ l2 → bfold_right_list2 T f l1 l2 = false).
+ #T; #f; #l1;
  nelim l1;
  ##[ ##1: #l2; ncases l2;
-          ##[ ##1: nnormalize; #H2; nelim (H2 (refl_eq …))
-          ##| ##2: #hh2; #ll2; nnormalize; #H2; napply refl_eq
+          ##[ ##1: #H; #H1; nnormalize; #H2; nelim (H2 (refl_eq …))
+          ##| ##2: #hh2; #ll2; #H; nnormalize; #H1; #H2; napply refl_eq
           ##]
- ##| ##2: #hh1; #ll1; #H2; #l2; ncases l2;
-          ##[ ##1: nnormalize; #H3; napply refl_eq
-          ##| ##2: #hh2; #ll2; #H3;
+ ##| ##2: #hh1; #ll1; #H; #l2; ncases l2;
+          ##[ ##1: #H1; #H2; nnormalize; #H3; napply refl_eq
+          ##| ##2: #hh2; #ll2; #H1; #H2; #H3;
                    nchange with (((f hh1 hh2)⊗(bfold_right_list2 T f ll1 ll2)) = false);
-                   napply (or2_elim (hh1 ≠ hh2) (ll1 ≠ ll2) ? (list_destruct T H … H3) …);
-                   ##[ ##1: #H4; nrewrite > (H1 hh1 hh2 H4); nnormalize; napply refl_eq
-                   ##| ##2: #H4; nrewrite > (H2 ll2 H4);
+                   napply (or2_elim (hh1 ≠ hh2) (ll1 ≠ ll2) ? (list_destruct T H1 … H3) …);
+                   ##[ ##1: #H4; nrewrite > (H2 hh1 hh2 H4); nnormalize; napply refl_eq
+                   ##| ##2: #H4; nrewrite > (H ll2 H1 H2 H4);
                             nrewrite > (symmetric_andbool (f hh1 hh2) false);
                             nnormalize; napply refl_eq
                    ##]
@@ -301,7 +267,7 @@ nlemma isbemptylist_to_isemptylist : ∀T,l.isb_empty_list T l = true → is_emp
  ncases l;
  nnormalize;
  ##[ ##1: #H; napply I
- ##| ##2: #x; #l; #H; ndestruct (*napply (bool_destruct … H)*)
+ ##| ##2: #x; #l; #H; napply (bool_destruct … H)
  ##]
 nqed.
 
@@ -309,7 +275,7 @@ nlemma isnotbemptylist_to_isnotemptylist : ∀T,l.isnotb_empty_list T l = true 
  #T; #l;
  ncases l;
  nnormalize;
- ##[ ##1: #H; ndestruct (*napply (bool_destruct … H)*)
+ ##[ ##1: #H; napply (bool_destruct … H)
  ##| ##2: #x; #l; #H; napply I
  ##]
 nqed.
@@ -332,143 +298,129 @@ nlemma symmetric_lennelist : ∀T.∀l1,l2:ne_list T.len_neList T l1 = len_neLis
  ##]
 nqed.
 
-nlemma symmetric_foldrightnelist2_aux :
-∀T1,T2:Type.∀f:T1 → T1 → T2 → T2.
- (∀x,y,z.f x y z = f y x z) →
- (∀acc:T2.∀l1,l2:ne_list T1.
-  ∀H1:len_neList T1 l1 = len_neList T1 l2.∀H2:len_neList T1 l2 = len_neList T1 l1.
-   fold_right_neList2 T1 T2 f acc l1 l2 H1 = fold_right_neList2 T1 T2 f acc l2 l1 H2).
- #T1; #T2; #f; #H; #acc; #l1;
+nlemma symmetric_foldrightnelist2_aux
+ : ∀T1,T2:Type.∀f:T1 → T1 → T2 → T2.∀acc:T2.∀l1,l2:ne_list T1.
+   ∀H1:len_neList T1 l1 = len_neList T1 l2.∀H2:len_neList T1 l2 = len_neList T1 l1.
+  (∀x,y,z.f x y z = f y x z) →
+  fold_right_neList2 T1 T2 f acc l1 l2 H1 = fold_right_neList2 T1 T2 f acc l2 l1 H2.
+ #T1; #T2; #f; #acc; #l1;
  nelim l1;
  ##[ ##1: #h; #l2; ncases l2;
-          ##[ ##1: #h1; nnormalize; #H1; #H2; nrewrite > (H h h1 acc); napply refl_eq
+          ##[ ##1: #h1; nnormalize; #H1; #H2; #H3; nrewrite > (H3 h h1 acc); napply refl_eq
           ##| ##2: #h1; #l; ncases l;
-                   ##[ ##1: #h3; #H1; #H2;
+                   ##[ ##1: #h3; #H1; #H2; #H3;
                             nchange in H1:(%) with ((S O) = (S (S O)));
-                            (* !!! ndestruct: si inceppa su un'ipotesi che non e' H1 *)
                             nelim (nat_destruct_0_S ? (nat_destruct_S_S … H1))
-                   ##| ##2: #h3; #l3; #H1; #H2;
+                   ##| ##2: #h3; #l3; #H1; #H2; #H3;
                             nchange in H1:(%) with ((S O) = (S (S (len_neList ? l3))));
-                            (* !!! ndestruct: si inceppa su un'ipotesi che non e' H1 *)
                             nelim (nat_destruct_0_S ? (nat_destruct_S_S … H1))
                    ##]                   
           ##]
- ##| ##2: #h3; #l3; #H1; #l2; ncases l2;
+ ##| ##2: #h3; #l3; #H; #l2; ncases l2;
           ##[ ##1: #h4; ncases l3;
-                   ##[ ##1: #h5; #H2; #H3;
-                            nchange in H2:(%) with ((S (S O)) = (S O));
-                            (* !!! ndestruct: si inceppa su un'ipotesi che non e' H1 *)
-                            nelim (nat_destruct_S_0 ? (nat_destruct_S_S … H2))
-                   ##| ##2: #h5; #l5; #H2; #H3;
-                            nchange in H2:(%) with ((S (S (len_neList ? l5))) = (S O));
-                            (* !!! ndestruct: si inceppa su un'ipotesi che non e' H1 *)
-                            nelim (nat_destruct_S_0 ? (nat_destruct_S_S … H2))
+                   ##[ ##1: #h5; #H1; #H2; #H3;
+                            nchange in H1:(%) with ((S (S O)) = (S O));
+                            nelim (nat_destruct_S_0 ? (nat_destruct_S_S … H1))
+                   ##| ##2: #h5; #l5; #H1; #H2; #H3;
+                            nchange in H1:(%) with ((S (S (len_neList ? l5))) = (S O));
+                            nelim (nat_destruct_S_0 ? (nat_destruct_S_S … H1))
                    ##]
-          ##| ##2: #h4; #l4; #H2; #H3;
-                   nchange in H2:(%) with ((S (len_neList ? l3)) = (S (len_neList ? l4)));
-                   nchange in H3:(%) with ((S (len_neList ? l4)) = (S (len_neList ? l3)));
+          ##| ##2: #h4; #l4; #H1; #H2; #H3;
+                   nchange in H1:(%) with ((S (len_neList ? l3)) = (S (len_neList ? l4)));
+                   nchange in H2:(%) with ((S (len_neList ? l4)) = (S (len_neList ? l3)));
                    nchange with ((f h3 h4 (fold_right_neList2 T1 T2 f acc l3 l4 (fold_right_neList2_aux3 T1 h3 h4 l3 l4 ?))) =
                                  (f h4 h3 (fold_right_neList2 T1 T2 f acc l4 l3 (fold_right_neList2_aux3 T1 h4 h3 l4 l3 ?))));
-                   nrewrite < (H1 l4 (fold_right_neList2_aux3 T1 h3 h4 l3 l4 H2) (fold_right_neList2_aux3 T1 h4 h3 l4 l3 H3));
-                   nrewrite > (H h3 h4 (fold_right_neList2 T1 T2 f acc l3 l4 ?));
+                   nrewrite < (H l4 (fold_right_neList2_aux3 T1 h3 h4 l3 l4 H1) (fold_right_neList2_aux3 T1 h4 h3 l4 l3 H2) H3);
+                   nrewrite > (H3 h3 h4 (fold_right_neList2 T1 T2 f acc l3 l4 ?));
                    napply refl_eq
           ##]
  ##]
 nqed.
 
-nlemma symmetric_foldrightnelist2 :
-∀T1,T2:Type.∀f:T1 → T1 → T2 → T2.
- (∀x,y,z.f x y z = f y x z) →
- (∀acc:T2.∀l1,l2:ne_list T1.∀H:len_neList T1 l1 = len_neList T1 l2.
-  fold_right_neList2 T1 T2 f acc l1 l2 H = fold_right_neList2 T1 T2 f acc l2 l1 (symmetric_lennelist T1 l1 l2 H)).
- #T1; #T2; #f; #H; #acc; #l1; #l2; #H1;
- nrewrite > (symmetric_foldrightnelist2_aux T1 T2 f H acc l1 l2 H1 (symmetric_lennelist T1 l1 l2 H1));
+nlemma symmetric_foldrightnelist2
+ : ∀T1,T2:Type.∀f:T1 → T1 → T2 → T2.∀acc:T2.∀l1,l2:ne_list T1.∀H:len_neList T1 l1 = len_neList T1 l2.
+  (∀x,y,z.f x y z = f y x z) →
+  fold_right_neList2 T1 T2 f acc l1 l2 H = fold_right_neList2 T1 T2 f acc l2 l1 (symmetric_lennelist T1 l1 l2 H).
+ #T1; #T2; #f; #acc; #l1; #l2; #H; #H1;
+ nrewrite > (symmetric_foldrightnelist2_aux T1 T2 f acc l1 l2 H (symmetric_lennelist T1 l1 l2 H) H1);
  napply refl_eq.
 nqed.
 
-nlemma symmetric_bfoldrightnelist2 :
-∀T1:Type.∀f:T1 → T1 → bool.
- (∀x,y.f x y = f y x) →
- (∀l1,l2:ne_list T1.
-  bfold_right_neList2 T1 f l1 l2 = bfold_right_neList2 T1 f l2 l1).
- #T; #f; #H; #l1;
+nlemma symmetric_bfoldrightnelist2
+ : ∀T1:Type.∀f:T1 → T1 → bool.∀l1,l2:ne_list T1.
+  (∀x,y.f x y = f y x) →
+  bfold_right_neList2 T1 f l1 l2 = bfold_right_neList2 T1 f l2 l1.
+ #T; #f; #l1;
  nelim l1;
  ##[ ##1: #hh1; #l2; ncases l2;
-          ##[ ##1: #hh2; nnormalize; nrewrite > (H hh1 hh2); napply refl_eq
-          ##| ##2: #hh2; #ll2; nnormalize; napply refl_eq
-          ##]
- ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2;
-          ##[ ##1: #hh2; nnormalize; napply refl_eq
-          ##| ##2: #hh2; #ll2; nnormalize;
-                   nrewrite > (H1 ll2);
-                   nrewrite > (H hh1 hh2);
+          ##[ ##1: #hh2; #H; nnormalize; nrewrite > (H hh1 hh2); napply refl_eq
+          ##| ##2: #hh2; #ll2; #H; nnormalize; napply refl_eq
+          ##]
+ ##| ##2: #hh1; #ll1; #H; #l2; ncases l2;
+          ##[ ##1: #hh2; #H1; nnormalize; napply refl_eq
+          ##| ##2: #hh2; #ll2; #H1; nnormalize;
+                   nrewrite > (H ll2 H1);
+                   nrewrite > (H1 hh1 hh2);
                    napply refl_eq
           ##]
  ##]
 nqed.
 
-nlemma bfoldrightnelist2_to_eq :
-∀T1:Type.∀f:T1 → T1 → bool.
- (∀x,y.(f x y = true → x = y)) →
- (∀l1,l2:ne_list T1.
-  (bfold_right_neList2 T1 f l1 l2 = true → l1 = l2)).
- #T; #f; #H; #l1;
+nlemma bfoldrightnelist2_to_eq
+ : ∀T1:Type.∀f:T1 → T1 → bool.∀l1,l2:ne_list T1.
+   (∀x,y.(f x y = true → x = y)) →
+   (bfold_right_neList2 T1 f l1 l2 = true → l1 = l2).
+ #T; #f; #l1;
  nelim l1;
  ##[ ##1: #hh1; #l2; ncases l2;
-          ##[ ##1: #hh2; #H1; nnormalize in H1:(%); nrewrite > (H hh1 hh2 H1); napply refl_eq
-          ##| ##2: #hh2; #ll2; nnormalize; #H1; ndestruct (*napply (bool_destruct … H1)*)
+          ##[ ##1: #hh2; #H; #H1; nnormalize in H1:(%); nrewrite > (H hh1 hh2 H1); napply refl_eq
+          ##| ##2: #hh2; #ll2; #H; nnormalize; #H1; napply (bool_destruct … H1)
           ##]
- ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2;
-          ##[ ##1: #hh2; nnormalize; #H2; ndestruct (*napply (bool_destruct … H2)*)
-          ##| ##2: #hh2; #ll2; #H2;
+ ##| ##2: #hh1; #ll1; #H; #l2; ncases l2;
+          ##[ ##1: #hh2; #H1; nnormalize; #H2; napply (bool_destruct … H2)
+          ##| ##2: #hh2; #ll2; #H1; #H2;
                    nchange in H2:(%) with (((f hh1 hh2)⊗(bfold_right_neList2 T f ll1 ll2)) = true);
-                   nrewrite > (H hh1 hh2 (andb_true_true_l … H2));
-                   nrewrite > (H1 ll2 (andb_true_true_r … H2));
+                   nrewrite > (H1 hh1 hh2 (andb_true_true_l … H2));
+                   nrewrite > (H ll2 H1 (andb_true_true_r … H2));
                    napply refl_eq
           ##]
  ##]
 nqed.
 
-nlemma eq_to_bfoldrightnelist2 :
-∀T1:Type.∀f:T1 → T1 → bool.
- (∀x,y.(x = y → f x y = true)) →
- (∀l1,l2:ne_list T1.
-  (l1 = l2 → bfold_right_neList2 T1 f l1 l2 = true)).
- #T; #f; #H; #l1;
+nlemma eq_to_bfoldrightnelist2
+ : ∀T1:Type.∀f:T1 → T1 → bool.∀l1,l2:ne_list T1.
+   (∀x,y.(x = y → f x y = true)) →
+   (l1 = l2 → bfold_right_neList2 T1 f l1 l2 = true).
+ #T; #f; #l1;
  nelim l1;
  ##[ ##1: #hh1; #l2; ncases l2;
-          ##[ ##1: #hh2; #H1; nnormalize;
+          ##[ ##1: #hh2; #H; #H1; nnormalize;
                    nrewrite > (H hh1 hh2 (nelist_destruct_nil_nil … H1));
                    napply refl_eq
-          ##| ##2: #hh2; #ll2; #H1;
-                   (* !!! ndestruct: assert false *)
-                   nelim (nelist_destruct_nil_cons ???? H1)
+          ##| ##2: #hh2; #ll2; #H; #H1; nelim (nelist_destruct_nil_cons ???? H1)
           ##]
- ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2;
-          ##[ ##1: #hh2; #H2;
-                   (* !!! ndestruct: assert false *)
-                   nelim (nelist_destruct_cons_nil ???? H2)
-          ##| ##2: #hh2; #ll2; #H2; nnormalize;
+ ##| ##2: #hh1; #ll1; #H; #l2; ncases l2;
+          ##[ ##1: #hh2; #H1; #H2; nelim (nelist_destruct_cons_nil ???? H2)
+          ##| ##2: #hh2; #ll2; #H1; #H2; nnormalize;
                    nrewrite > (nelist_destruct_cons_cons_1 … H2);
-                   nrewrite > (H hh2 hh2 (refl_eq …));
+                   nrewrite > (H1 hh2 hh2 (refl_eq …));
                    nnormalize;
-                   nrewrite > (H1 ll2 (nelist_destruct_cons_cons_2 … H2));
+                   nrewrite > (H ll2 H1 (nelist_destruct_cons_cons_2 … H2));
                    napply refl_eq
           ##]
  ##]
 nqed.
 
-nlemma bfoldrightnelist2_to_lennelist :
-∀T.∀f:T → T → bool.
- (∀l1,l2:ne_list T.bfold_right_neList2 T f l1 l2 = true → len_neList T l1 = len_neList T l2).
+nlemma bfoldrightnelist2_to_lennelist
+ : ∀T.∀f:T → T → bool.∀l1,l2:ne_list T.bfold_right_neList2 T f l1 l2 = true → len_neList T l1 = len_neList T l2.
  #T; #f; #l1;
  nelim l1;
  ##[ ##1: #hh1; #l2; ncases l2;
           ##[ ##1: nnormalize; #hh2; #H; napply refl_eq
-          ##| ##2: nnormalize; #hh2; #tt2; #H; ndestruct (*napply (bool_destruct … H)*)
+          ##| ##2: nnormalize; #hh2; #tt2; #H; napply (bool_destruct … H)
           ##]
  ##| ##2: #hh1; #tt1; #H; #l2; ncases l2;
-          ##[ ##1: nnormalize; #hh2; #H1; ndestruct (*napply (bool_destruct … H1)*)
+          ##[ ##1: nnormalize; #hh2; #H1; napply (bool_destruct … H1)
           ##| ##2: #hh2; #tt2; #H1; nnormalize;
                    nrewrite > (H tt2 ?);
                    ##[ ##1: napply refl_eq
@@ -479,9 +431,7 @@ nlemma bfoldrightnelist2_to_lennelist :
  ##]
 nqed.
 
-nlemma decidable_nelist :
-∀T.(∀x,y:T.decidable (x = y)) →
-   (∀x,y:ne_list T.decidable (x = y)).
+nlemma decidable_nelist : ∀T.∀H:(Πx,y:T.decidable (x = y)).∀x,y:ne_list T.decidable (x = y).
  #T; #H; #x; nelim x;
  ##[ ##1: #hh1; #y; ncases y;
           ##[ ##1: #hh2; nnormalize; napply (or2_elim (hh1 = hh2) (hh1 ≠ hh2) ? (H hh1 hh2));
@@ -490,15 +440,11 @@ nlemma decidable_nelist :
                             #H2; napply (H1 (nelist_destruct_nil_nil T … H2))
                    ##]
           ##| ##2: #hh2; #tt2; nnormalize; napply (or2_intro2 (? = ?) (? ≠ ?) ?);
-                   nnormalize; #H1;
-                   (* !!! ndestruct: assert false *)
-                   napply (nelist_destruct_nil_cons T … H1)
+                   nnormalize; #H1; napply (nelist_destruct_nil_cons T … H1)
           ##]
  ##| ##2: #hh1; #tt1; #H1; #y; ncases y;
           ##[ ##1: #hh1; nnormalize; napply (or2_intro2 (? = ?) (? ≠ ?) ?);
-                   nnormalize; #H2;
-                   (* !!! ndestruct: assert false *)
-                   napply (nelist_destruct_cons_nil T … H2)
+                   nnormalize; #H2; napply (nelist_destruct_cons_nil T … H2)
           ##| ##2: #hh2; #tt2; nnormalize; napply (or2_elim (hh1 = hh2) (hh1 ≠ hh2) ? (H …));
                    ##[ ##2: #H2; napply (or2_intro2 (? = ?) (? ≠ ?) ?);
                             nnormalize; #H3; napply (H2 (nelist_destruct_cons_cons_1 T … H3))
@@ -513,30 +459,25 @@ nlemma decidable_nelist :
  ##]
 nqed.
 
-nlemma nbfoldrightnelist2_to_neq :
-∀T1:Type.∀f:T1 → T1 → bool.
- (∀x,y.(f x y = false → x ≠ y)) →
- (∀l1,l2:ne_list T1.
-  (bfold_right_neList2 T1 f l1 l2 = false → l1 ≠ l2)).
- #T; #f; #H; #l1;
+nlemma nbfoldrightnelist2_to_neq
+ : ∀T1:Type.∀f:T1 → T1 → bool.∀l1,l2:ne_list T1.
+   (∀x,y.(f x y = false → x ≠ y)) →
+   (bfold_right_neList2 T1 f l1 l2 = false → l1 ≠ l2).
+ #T; #f; #l1;
  nelim l1;
  ##[ ##1: #hh1; #l2; ncases l2;
-          ##[ ##1: #hh2; nnormalize; #H1; #H2; napply (H hh1 hh2 H1 (nelist_destruct_nil_nil T … H2))
-          ##| ##2: #hh2; #ll2; #H1; nnormalize; #H2;
-                   (* !!! ndestruct: assert false *)
-                   napply (nelist_destruct_nil_cons T … H2)
+          ##[ ##1: #hh2; #H; nnormalize; #H1; #H2; napply (H hh1 hh2 H1 (nelist_destruct_nil_nil T … H2))
+          ##| ##2: #hh2; #ll2; #H; #H1; nnormalize; #H2; napply (nelist_destruct_nil_cons T … H2)
           ##]
- ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2;
-          ##[ ##1: #hh2; #H2; nnormalize; #H3;
-                   (* !!! ndestruct: assert false *)
-                   napply (nelist_destruct_cons_nil T … H3)
-          ##| ##2: #hh2; #ll2; #H2; nnormalize; #H3;
+ ##| ##2: #hh1; #ll1; #H; #l2; ncases l2;
+          ##[ ##1: #hh2; #H1; #H2; nnormalize; #H3; napply (nelist_destruct_cons_nil T … H3)
+          ##| ##2: #hh2; #ll2; #H1; #H2; nnormalize; #H3;
                    nchange in H2:(%) with (((f hh1 hh2)⊗(bfold_right_neList2 T f ll1 ll2)) = false);
-                   napply (H1 ll2 ? (nelist_destruct_cons_cons_2 T … H3));
+                   napply (H ll2 H1 ? (nelist_destruct_cons_cons_2 T … H3));
                    napply (or2_elim ??? (andb_false2 … H2) );
                    ##[ ##1: #H4; napply (absurd (hh1 = hh2) …);
                             ##[ ##1: nrewrite > (nelist_destruct_cons_cons_1 T … H3); napply refl_eq
-                            ##| ##2: napply (H … H4)
+                            ##| ##2: napply (H1 … H4)
                             ##]
                    ##| ##2: #H4; napply H4
                    ##]
@@ -544,10 +485,8 @@ nlemma nbfoldrightnelist2_to_neq :
  ##]
 nqed.
 
-nlemma nelist_destruct :
-∀T.(∀x,y:T.decidable (x = y)) →
-   (∀h1,h2:T.∀l1,l2:ne_list T.
-    (h1§§l1) ≠ (h2§§l2) → h1 ≠ h2 ∨ l1 ≠ l2).
+nlemma nelist_destruct
+ : ∀T.∀H:(Πx,y:T.decidable (x = y)).∀h1,h2:T.∀l1,l2:ne_list T.(h1§§l1) ≠ (h2§§l2) → h1 ≠ h2 ∨ l1 ≠ l2.
  #T; #H; #h1; #h2; #l1; nelim l1;
  ##[ ##1: #hh1; #l2; ncases l2;
           ##[ ##1: #hh2; #H1; napply (or2_elim (h1 = h2) (h1 ≠ h2) ? (H …) …);
@@ -560,15 +499,11 @@ nlemma nelist_destruct :
                             ##]
                    ##]
           ##| ##2: #hh2; #ll2; #H1; napply (or2_intro2 (h1 ≠ h2) («£hh1» ≠ (hh2§§ll2)) …);
-                   nnormalize; #H2;
-                   (* !!! ndestruct: assert false *)
-                   napply (nelist_destruct_nil_cons T … H2)
+                   nnormalize; #H2; napply (nelist_destruct_nil_cons T … H2)
           ##]
  ##| ##2: #hh1; #ll1; #H1; #l2; ncases l2;
           ##[ ##1: #hh2; #H2; napply (or2_intro2 (h1 ≠ h2) ((hh1§§ll1) ≠ «£hh2») …);
-                   nnormalize; #H3;
-                   (* !!! ndestruct: assert false *)
-                   napply (nelist_destruct_cons_nil T … H3)
+                   nnormalize; #H3; napply (nelist_destruct_cons_nil T … H3)
           ##| ##2: #hh2; #ll2; #H2;     
                    napply (or2_elim (h1 = h2) (h1 ≠ h2) ? (H h1 h2) …);
                    ##[ ##2: #H3; napply (or2_intro1 (h1 ≠ h2) ((hh1§§ll1) ≠ (hh2§§ll2)) H3)
@@ -582,26 +517,25 @@ nlemma nelist_destruct :
  ##]
 nqed.
 
-nlemma neq_to_nbfoldrightnelist2 :
-∀T:Type.∀f:T → T → bool.
- (∀x,y:T.decidable (x = y)) →
- (∀x,y.(x ≠ y → f x y = false)) →
- (∀l1,l2:ne_list T.
-  (l1 ≠ l2 → bfold_right_neList2 T f l1 l2 = false)).
- #T; #f; #H; #H1; #l1;
+nlemma neq_to_nbfoldrightnelist2
+ : ∀T:Type.∀f:T → T → bool.∀l1,l2:ne_list T.
+   (∀x,y:T.decidable (x = y)) →
+   (∀x,y.(x ≠ y → f x y = false)) →
+   (l1 ≠ l2 → bfold_right_neList2 T f l1 l2 = false).
+ #T; #f; #l1;
  nelim l1;
  ##[ ##1: #hh1; #l2; ncases l2;
-          ##[ ##1: #hh2; nnormalize; #H2; napply (H1 hh1 hh2 ?);
+          ##[ ##1: #hh2; #H; #H1; nnormalize; #H2; napply (H1 hh1 hh2 ?);
                    nnormalize; #H3; nrewrite > H3 in H2:(%); #H2; napply (H2 (refl_eq …))
-          ##| ##2: #hh2; #ll2; nnormalize; #H2; napply refl_eq
+          ##| ##2: #hh2; #ll2; #H; nnormalize; #H1; #H2; napply refl_eq
           ##]
- ##| ##2: #hh1; #ll1; #H2; #l2; ncases l2;
-          ##[ ##1: #hh2; nnormalize; #H3; napply refl_eq
-          ##| ##2: #hh2; #ll2; #H3;
+ ##| ##2: #hh1; #ll1; #H; #l2; ncases l2;
+          ##[ ##1: #hh2; #H1; #H2; nnormalize; #H3; napply refl_eq
+          ##| ##2: #hh2; #ll2; #H1; #H2; #H3;
                    nchange with (((f hh1 hh2)⊗(bfold_right_neList2 T f ll1 ll2)) = false);
-                   napply (or2_elim (hh1 ≠ hh2) (ll1 ≠ ll2) ? (nelist_destruct T H … H3) …);
-                   ##[ ##1: #H4; nrewrite > (H1 hh1 hh2 H4); nnormalize; napply refl_eq
-                   ##| ##2: #H4; nrewrite > (H2 ll2 H4);
+                   napply (or2_elim (hh1 ≠ hh2) (ll1 ≠ ll2) ? (nelist_destruct T H1 … H3) …);
+                   ##[ ##1: #H4; nrewrite > (H2 hh1 hh2 H4); nnormalize; napply refl_eq
+                   ##| ##2: #H4; nrewrite > (H ll2 H1 H2 H4);
                             nrewrite > (symmetric_andbool (f hh1 hh2) false);
                             nnormalize; napply refl_eq
                    ##]