Int_liste.v


Require Export Int_comp.
Require Export PolyList.
(* l' appartenance a une liste est decidable *)

Lemma In_int_decide: (l:(list int)) (i:int){(In i l)}+{~ (In i l)}.
Induction l.
Intros; Right; Red; Intros; Inversion H.
Intros t q HR i.
Case (eq_int_decide i t); Intros.
Left; LApply (eq_int_eq i t); Auto.
Intros A; Rewrite A; Auto.
Elim (HR i); [Left | Right]; Auto.
Red; Simpl; Intros A; Elim A; Auto; Intros.
Absurd (eq_int i t); Auto; Rewrite <- H; Auto.
Qed.

Lemma In_moins: (l:(list int)) (i:int) (In i l) ->(In (moins i) (map moins l)).
Induction l.
Simpl; Auto.
Intros t q HR i.
Simpl; Intros A; Elim A; Intros; Auto.
Left; Rewrite H; Auto.
Qed.
Hint In_moins.

Lemma In_map_moins:
  (l:(list
int)) (i:int) (In i (map moins l)) ->(In (moins i) l).
Induction l.
Intros; Simpl; Auto.
Intros; Simpl; Auto.
Simpl in H0; Elim H0; Intros; Auto.
Left; Rewrite <- H1; Auto.
Qed.
Hint In_map_moins.

(* liste des int dont la position est <=  n  
 utile pour les programmes de decidabilite *)


Fixpoint int_position_le_n[n:nat]: (list int) :=
   Cases n of
       O => (cons Moins_Un (cons Un (nil int)))
      | (S p) => (cons (M p) (cons (P p) (int_position_le_n p)))
   end.

Lemma liste_int_complete:
  (n:nat) (i:
int)(iff (le (position i) n) (In i (int_position_le_n n))).
Induction n; Split.
Case i; Simpl; Intros; Inversion H.
Right; Left; Auto.
Left; Auto.
Simpl.
Intros H; Elim H.
Intros A; Rewrite <- A; Auto.
Intros H1; Elim H1.
Intros A; Rewrite <- A; Auto.
Intros; Contradiction.
Case (le_lt_dec (position i) n0).
Intros.
Elim (H i); Intros Sens1 Sens2.
Simpl; Right; Right; Auto.
Intros.
Cut (position i)=(S n0); Auto.
Case i; Simpl; Intros; Inversion H1.
Right; Left; Auto.
Left; Auto.
Simpl.
Intros A; Elim A; Auto.
Intros B; Rewrite <- B; Auto.
Intros B; Elim B; Auto.
Intros C; Rewrite <- C; Auto.
Elim (H i); Intros Sens1 Sens2.
Intros; Auto.
Qed.
(* liste des int  positifs dont la position est <=  n  *)

Fixpoint int_positif_position_le_n[n:nat]: (list int) :=
   Cases n of
       O => (cons Un (nil int))
      | (S p) => (cons (P p) (int_positif_position_le_n p))
   end.

Definition int_positif_position_lt_n :=
   [n:nat]
      Cases n of
          O => (nil
int)
         | (S p) => (int_positif_position_le_n p)
      end.

Lemma liste_int_positif_complete:
  (n:nat) (i:
int)
  (iff
     (le (position i) n) /\ (positif i)=true
     (In i (int_positif_position_le_n n))).
Induction n; Split.
Case i; Simpl; Intros; Inversion H; Auto.
Absurd (le (S n0) O); Auto.
Simpl.
Intros H; Elim H.
Intros A; Rewrite <- A; Auto.
Intros A; Contradiction.
Simpl.
Case (le_lt_dec (position i) n0); Intros; Elim H0; Intros.
Elim (H i); Intros Sens1 Sens2.
Right; Apply Sens1; Auto.
Cut (position i)=(S n0); Auto.
Generalize H1 H2.
Case i; Simpl; Intros; Inversion H5; Auto.
Inversion H4.
Simpl.
Intros H1; Elim H1; Intros.
Split; Rewrite <- H0; Auto.
Elim (H i); Intros Sens1 Sens2.
Elim (Sens2 H0); Intros.
Split; Auto.
Qed.

Lemma liste_int_positif_lt_complete:
  (n:nat) (i:
int)
  (iff
     (lt (position i) n) /\ (positif i)=true
     (In i (int_positif_position_lt_n n))).
Intros n i.
Case n.
Simpl; Split; Auto.
Intros H; Elim H; Intros; Absurd (lt (position i) O); Auto.
Intros H; Contradiction.
Unfold int_positif_position_lt_n.
Clear n; Intros n.
Elim (liste_int_positif_complete n i); Intros Sens1 Sens2.
Split.
Intros H; Elim H; Intros.
Apply Sens1; Auto.
Intros H; LApply Sens2; Auto.
Intros H1; Elim H1; Intros.
Split; Auto.
Qed.

(* appartenance "en valeur absolue" a une liste *)

Definition In_va := [i:int] [l:(list int)](In i l) \/ (In (moins i) l).

Lemma In_va_cons1:
  (i, t:
int) (q:(list int)) (In_va i (cons t q)) ->
  (abs i)=(abs t) \/ (In_va i q).
Unfold In_va; Simpl.
Intros.
Elim H; Intros; Elim H0; Intros; Auto.
Left; Rewrite H1; Auto.
Left; Rewrite H1; Auto.
Qed.
Hint In_va_cons1.

Lemma In_va_cons21:
  (i, t:
int) (q:(list int)) (abs i)=(abs t) ->(In_va i (cons t q)).
Unfold In_va; Simpl; Intros.
LApply (abs_inj i t); Intros; Auto.
Elim H0; Intros; Auto.
Right; Left; Rewrite y; Auto.
Qed.
Hint In_va_cons21.

Lemma In_va_cons22:
  (i, t:
int) (q:(list int)) (In_va i q) ->(In_va i (cons t q)).
Unfold In_va; Simpl; Intros.
Elim H; Intros; Auto.
Qed.
Hint In_va_cons22.

Lemma In_va_map_moins:
  (l:(list
int)) (i:int) (In_va i l) ->(In_va i (map moins l)).
Induction l.
Simpl; Auto.
Intros t q HR i.
Simpl; Intros.
LApply (In_va_cons1 i t q); Auto; Intros.
Elim H0; Intros; Auto.
Cut (abs i)=(abs (moins t)); [Auto | Rewrite H1; Auto].
Qed.
Hint In_va_map_moins.

(* intersection vide "en valeur absolue" *)

Definition inter_va_vide :=
   [l1, l2:(list
int)] (j:int) (In_va j l1) -> (In_va j l2) ->False.


14/09/98, 09:21