Library IPC.ML_Int



Axiom Int : Set.
Axiom Less : Int Int Prop.
Axiom Equal : Int Int Prop.
Axiom int_succ : x : Int, {y : Int | Less x y}.
Axiom int_null : Int.

Axiom equal_dec : x y : Int, {Equal x y} + {¬ Equal x y}.
Axiom less_dec : x y : Int, {Less x y} + {¬ Less x y}.

Axiom
  notequal_notless_greater :
     x y : Int, ¬ Equal x y ¬ Less x y Less y x.

Axiom less_trans : x y z : Int, Less x y Less y z Less x z.
Axiom equal_less_less : x y z : Int, Equal x y Less y z Less x z.
Axiom less_equal_less : x y z : Int, Less x y Equal y z Less x z.
Axiom equal_sym : x y : Int, Equal x y Equal y x.
Axiom equal_trans : x y z : Int, Equal x y Equal y z Equal x z.
Axiom equal_refl : x : Int, Equal x x.
Axiom equal_eq : x y : Int, Equal x y x = y.

Axiom less_irrefl : x : Int, Less x x False.

Lemma equal_dec_refl :
  (i : Int) (A : Set) (a b : A),
 match equal_dec i i with
 | left _a
 | right _b
 end = a.
intros i A a b.
elim (equal_dec i i).
intros; trivial.
intros notequal; elimtype False; apply notequal.
apply equal_refl.
Qed.

Inductive max_int_spec (i0 i1 : Int) : Set :=
    Max_Int_Intro :
       j : Int,
      Less i0 j Equal i0 j
      Less i1 j Equal i1 j max_int_spec i0 i1.

Lemma max_int : i0 i1 : Int, max_int_spec i0 i1.
intros i0 i1.
elim (equal_dec i0 i1).
intros eq_i0_i1.
i0.
right.
apply equal_refl.
right.
apply equal_sym; assumption.

intros not_eq_i0_i1.
elim (less_dec i0 i1).
intros less_i0_i1.
i1.
left; assumption.
right.
apply equal_refl.

intros ge_i0_i1.
i0.
right.
apply equal_refl.
left.
apply notequal_notless_greater; assumption.
Qed.