]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/matita/library/list/sort.ma
- renamed ocaml/ to components/
[helm.git] / helm / matita / library / list / sort.ma
diff --git a/helm/matita/library/list/sort.ma b/helm/matita/library/list/sort.ma
deleted file mode 100644 (file)
index 939cece..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-(**************************************************************************)
-(*       ___                                                              *)
-(*      ||M||                                                             *)
-(*      ||A||       A project by Andrea Asperti                           *)
-(*      ||T||                                                             *)
-(*      ||I||       Developers:                                           *)
-(*      ||T||         The HELM team.                                      *)
-(*      ||A||         http://helm.cs.unibo.it                             *)
-(*      \   /                                                             *)
-(*       \ /        This file is distributed under the terms of the       *)
-(*        v         GNU General Public License Version 2                  *)
-(*                                                                        *)
-(**************************************************************************)
-
-set "baseuri" "cic:/matita/list/sort/".
-
-include "datatypes/bool.ma".
-include "datatypes/constructors.ma".
-include "list/list.ma".
-
-let rec mem (A:Set) (eq: A → A → bool) x (l: list A) on l ≝
- match l with
-  [ nil ⇒ false
-  | (cons a l') ⇒
-    match eq x a with
-     [ true ⇒ true
-     | false ⇒ mem A eq x l'
-     ]
-  ].
-  
-let rec ordered (A:Set) (le: A → A → bool) (l: list A) on l ≝
- match l with
-  [ nil ⇒ true
-  | (cons x l') ⇒
-     match l' with
-      [ nil ⇒ true
-      | (cons y l'') ⇒
-          le x y \land ordered A le l'
-      ]
-  ].
-  
-let rec insert (A:Set) (le: A → A → bool) x (l: list A) on l ≝
- match l with
-  [ nil ⇒ [x]
-  | (cons he l') ⇒
-      match le x he with
-       [ true ⇒ x::l
-       | false ⇒ he::(insert A le x l')
-       ]
-  ].
-
-lemma insert_ind :
- ∀A:Set. ∀le: A → A → bool. ∀x.
-  ∀P:(list A → list A → Prop).
-   ∀H:(∀l: list A. l=[] → P [] [x]).
-    ∀H2:
-    (∀l: list A. ∀he. ∀l'. P l' (insert ? le x l') →
-      le x he = false → l=he::l' → P (he::l') (he::(insert ? le x l'))).
-     ∀H3:
-     (∀l: list A. ∀he. ∀l'. P l' (insert ? le x l') →
-       le x he = true → l=he::l' → P (he::l') (x::he::l')).
-    ∀l:list A. P l (insert ? le x l).
-  intros.
-  apply (
-    let rec insert_ind (l: list A) \def
-    match l in list
-    return
-      λli.
-       l = li → P li (insert ? le x li)
-    with
-     [ nil ⇒ H l
-     | (cons he l') ⇒
-         match le x he
-         return
-          λb. le x he = b → l = he::l' →
-           P (he::l')
-            (match b with 
-              [ true ⇒ x::he::l'
-              | false ⇒ he::(insert ? le x l') ])
-         with
-          [ true ⇒ H2 l he l' (insert_ind l')
-          | false ⇒ H1 l he l' (insert_ind l')
-          ]
-         (refl_eq ? (le x he))
-     ] (refl_eq ? l) in insert_ind l).
-qed.
-
-
-let rec insertionsort (A:Set) (le: A → A → bool) (l: list A) on l ≝
- match l with
-  [ nil ⇒ []
-  | (cons he l') ⇒
-      let l'' ≝ insertionsort A le l' in
-       insert A le he l''
-  ].
-
-lemma ordered_injective:
-  ∀A:Set. ∀le:A → A → bool.
-   ∀l:list A. ordered A le l = true → ordered A le (tail A l) = true.
-  intros 3 (A le l).
-  elim l
-  [ simplify; reflexivity;
-  | simplify;
-    generalize in match H1;
-    clear H1;
-    elim l1;
-    [ simplify; reflexivity;
-    | cut ((le s s1 \land ordered A le (s1::l2)) = true);
-      [ generalize in match Hcut; 
-        apply andb_elim;
-        elim (le s s1);
-        [ simplify;
-          fold simplify (ordered ? le (s1::l2));
-          intros; assumption;
-        | simplify;
-          intros (Habsurd);
-          apply False_ind;
-          apply (not_eq_true_false);
-          symmetry;
-          assumption
-        ]
-      | exact H2;
-      ]
-    ]
-  ].
-qed.
-
-lemma insert_sorted:
-  \forall A:Set. \forall le:A\to A\to bool.
-  (\forall a,b:A. le a b = false \to le b a = true) \to
-  \forall l:list A. \forall x:A.
-    ordered A le l = true \to ordered A le (insert A le x l) = true.
- intros 5 (A le H l x).
- apply (insert_ind ? ? ? (λl,il. ordered ? le l = true → ordered ? le il = true));
- clear l; intros; simplify; intros;
-  [2: rewrite > H1;
-    [ generalize in match (H ? ? H2); clear H2; intro;
-      generalize in match H4; clear H4;
-      elim l'; simplify;
-      [ rewrite > H5;
-        reflexivity
-      | elim (le x s); simplify;
-        [ rewrite > H5;
-          reflexivity
-        | simplify in H4;
-          rewrite > (andb_true_true ? ? H4);
-          reflexivity
-        ]
-      ]
-    | apply (ordered_injective ? ? ? H4)
-    ]
-  | reflexivity
-  | rewrite > H2;
-    rewrite > H4;
-    reflexivity
-  ].
-qed.
-  
-theorem insertionsort_sorted:
-  ∀A:Set.
-  ∀le:A → A → bool.∀eq:A → A → bool.
-  (∀a,b:A. le a b = false → le b a = true) \to
-  ∀l:list A.
-  ordered A le (insertionsort A le l) = true.
-  intros 5 (A le eq le_tot l).
-  elim l;
-  [ simplify;
-    reflexivity;
-  | apply (insert_sorted ? ? le_tot (insertionsort ? le l1) s);
-    assumption;
-  ]
-qed.
\ No newline at end of file