Int_comp.v
Require Export Int_signe.
Require Export Arith.
Require Export EqNat.
Require Export Compare_dec.
(* egalite decidable sur mes int *)
Definition
eq_int :=
[i, j:int]
Cases i j of
Un Un => True
| Un _ => False
| Moins_Un Moins_Un => True
| Moins_Un _ => False
| (P n) (P m) => (eq_nat n m)
| (P n) _ => False
| (M n) (M m) => (eq_nat n m)
| (M n) _ => False
end.
Lemma
eq_int_refl: (i:int)(eq_int i i).
Induction i; Simpl; Auto.
Qed.
Hint eq_int_refl.
Lemma
eq_eq_int: (i, j:int) i=j ->(eq_int i j).
Intros i j N; Rewrite N; Auto.
Qed.
Immediate eq_eq_int.
Lemma
eq_int_eq: (i, j:int) (eq_int i j) ->i=j.
Intros i j; Elim i; Elim j; Simpl; Intros; Contradiction Orelse Auto;
Rewrite (eq_nat_eq n0 n); Auto.
Qed.
Immediate eq_int_eq.
Lemma
non_eq_moins_1: (i:int)~ (eq_int i (moins i)).
Intros; Elim i; Simpl; Red; Intros; Contradiction.
Qed.
Immediate non_eq_moins_1.
Lemma
non_eq_moins_2: (i:int)~ (eq_int (moins i) i).
Intros; Elim i; Simpl; Red; Intros; Contradiction.
Qed.
Immediate non_eq_moins_2.
Lemma
eq_int_decide: (i, j:int){(eq_int i j)}+{~ (eq_int i j)}.
Intros; Elim i; Auto.
Elim j; Auto; Right; Red; Auto.
Elim j; Auto; Right; Red; Auto.
Elim j.
Right; Red; Auto.
Right; Red; Auto.
Intros; Simpl; Case (eq_nat_decide n0 n); [Left | Right]; Auto.
Right; Red; Auto.
Elim j.
Right; Red; Auto.
Right; Red; Auto.
Right; Red; Auto.
Intros; Simpl; Case (eq_nat_decide n0 n); [Left | Right]; Auto.
Qed.
(* ordre en valeur absolue *)
Definition
le_va := [i, j:int](le (position i) (position j)).
Definition
lt_va := [i, j:int](lt (position i) (position j)).
Hint Unfold le_va.
Hint Unfold lt_va.
(* lemmes pour le_va *)
Lemma
le_va_le_pos: (i, j:int) (le_va i j) ->(le (position i) (position j)).
Intros; Auto.
Qed.
Hint le_va_le_pos.
Lemma
le_va_refl: (i:int)(le_va i i).
Auto.
Qed.
Hint le_va_refl.
Lemma
le_va_trans: (i, j, k:int) (le_va i j) -> (le_va j k) ->(le_va i k).
Unfold le_va; Intros; Apply le_trans with (position j); Auto.
Qed.
Lemma
le_va_antisym: (i, j:int) (le_va i j) -> (le_va j i) ->(abs i)=(abs j).
Auto.
Qed.
Hint le_va_antisym.
(* lemmes pour lt_va *)
Lemma
lt_va_not_refl: (i:int)~ (lt_va i i).
Unfold lt_va; Intros; Apply lt_n_n; Auto.
Qed.
Hint lt_va_not_refl.
Lemma
lt_va_not_sym: (i, j:int) (lt_va i j) ->~ (lt_va j i).
Unfold lt_va; Intros; Apply lt_not_sym; Auto.
Qed.
Hint lt_va_not_sym.
Lemma
lt_va_trans: (i, j, k:int) (lt_va i j) -> (lt_va j k) ->(lt_va i k).
Unfold lt_va; Intros; Apply lt_trans with (position j); Auto.
Qed.
(* lt_va et le_va melanges *)
Lemma
le_lt_va_exclus: (i, j:int) (le_va i j) -> (lt_va j i) ->False.
Unfold lt_va; Unfold le_va; Intros; Auto.
Absurd (lt (position j) (position i)); Auto.
Qed.
Lemma
le_va_non_lt: (i, j:int) (le_va i j) ->~ (lt_va j i).
Intros; Red; Intros; LApply (le_lt_va_exclus i j H); Auto; Contradiction.
Qed.
Hint le_va_non_lt.
Lemma
lt_va_non_le: (i, j:int) (lt_va i j) ->~ (le_va j i).
Intros; Red; Intros; LApply (le_lt_va_exclus j i H0); Auto; Contradiction.
Qed.
Hint lt_va_non_le.
Lemma
lt_va_ordre_total:
(i, j:int) ~ (abs i)=(abs j) ->(lt_va i j) \/ (lt_va j i).
Unfold le_va lt_va; Intros; Apply nat_total_order; Auto.
Red; Intros; Absurd (abs i)=(abs j); Auto.
Qed.
Hint lt_va_ordre_total.
Lemma
lt_va_or_abs: (i, j:int) (le_va i j) ->(lt_va i j) \/ (abs i)=(abs j).
Intros; Case (eq_int_decide (abs i) (abs j)); [Right | Left]; Auto.
LApply (lt_va_ordre_total i j);
[Intro A; Elim A; Auto; Intros; LApply (le_lt_va_exclus i j H);
Try Contradiction | Red; Intros; Absurd (eq_int (abs i) (abs j))]; Auto.
Qed.
Hint lt_va_or_abs.
Lemma
lt_va_non_eq: (i, j:int) (lt_va i j) ->~ (abs i)=(abs j).
Intros; Red; Intros.
Absurd (lt (position i) (position j)); Auto.
Rewrite (abs_position_inj i j); Auto.
Qed.
Hint lt_va_non_eq.
Lemma
lt_le_va_trans: (i, j, k:int) (lt_va i j) -> (le_va j k) ->(lt_va i k).
Unfold lt_va le_va; Intros; Auto.
Apply lt_le_trans with m := (position j); Auto.
Qed.
Lemma
le_lt_va_trans: (i, j, k:int) (le_va i j) -> (lt_va j k) ->(lt_va i k).
Unfold lt_va le_va; Intros; Auto.
Apply le_lt_trans with m := (position j); Auto.
Qed.
Lemma
lt_le_va_weak: (i, j:int) (lt_va i j) ->(le_va i j).
Auto.
Qed.
Hint lt_le_va_weak.
Lemma
le_lt_va_dec: (i, j:int){(le_va i j)}+{(lt_va j i)}.
Intros; Case (le_lt_dec (position i) (position j)); Auto.
Qed.
(* ordre et moins *)
Lemma
le_va_moins1: (i, j:int) (le_va i j) ->(le_va i (moins j)).
Unfold lt_va le_va; Intros i j; Case j; Simpl; Auto.
Qed.
Lemma
le_va_moins2: (i, j:int) (le_va i j) ->(le_va (moins i) j).
Unfold lt_va le_va; Intros i j; Case i; Simpl; Auto.
Qed.
Lemma
lt_va_moins1: (i, j:int) (lt_va i j) ->(lt_va i (moins j)).
Unfold lt_va le_va; Intros i j; Case j; Simpl; Auto.
Qed.
Lemma
lt_va_moins2: (i, j:int) (lt_va i j) ->(lt_va (moins i) j).
Unfold lt_va le_va; Intros i j; Case i; Simpl; Auto.
Qed.
Hint le_va_moins1 le_va_moins2 lt_va_moins1 lt_va_moins2.
14/09/98, 09:21