Coq.Sets.Integers

# Module Coq.Sets.Integers

``Require` `Export` Finite_sets.
`Require` `Export` Constructive_sets.
`Require` `Export` Classical_Type.
`Require` `Export` Classical_sets.
`Require` `Export` Powerset.
`Require` `Export` Powerset_facts.
`Require` `Export` Powerset_Classical_facts.
`Require` `Export` Gt.
`Require` `Export` Lt.
`Require` `Export` Le.
`Require` `Export` Finite_sets_facts.
`Require` `Export` Image.
`Require` `Export` Infinite_sets.
`Require` `Export` Compare_dec.
`Require` `Export` Relations_1.
`Require` `Export` Partial_Order.
`Require` `Export` Cpo.

`Section` Integers_sect.

`Inductive` Integers : (Ensemble nat) :=
Integers_defn: (x: nat) (In nat Integers x).
`Hints` Resolve Integers_defn.

`Lemma` le_reflexive: (Reflexive nat le).
`Proof`.
Red; Auto with arith.
`Qed`.

`Lemma` le_antisym: (Antisymmetric nat le).
`Proof`.
Red; Intros x y H H';Rewrite (le_antisym x y);Auto.
`Qed`.

`Lemma` le_trans: (Transitive nat le).
`Proof`.
Red; Intros; Apply le_trans with y;Auto.
`Qed`.
`Hints` Resolve le_reflexive le_antisym le_trans.

`Lemma` le_Order: (Order nat le).
`Proof`.
Auto with sets arith.
`Qed`.
`Hints` Resolve le_Order.

`Lemma` triv_nat: (n: nat) (In nat Integers n).
`Proof`.
Auto with sets arith.
`Qed`.
`Hints` Resolve triv_nat.

`Definition` nat_po: (PO nat).
Apply Definition_of_PO with Carrier_of := Integers Rel_of := le; Auto with sets arith.
Apply Inhabited_intro with x := O; Auto with sets arith.
`Defined`.
`Hints` Unfold nat_po.

`Lemma` le_total_order: (Totally_ordered nat nat_po Integers).
`Proof`.
Apply Totally_ordered_definition.
Simpl.
Intros H' x y H'0.
Specialize 2 le_or_lt with n := x m := y; Intro H'2; Elim H'2.
Intro H'1; Left; Auto with sets arith.
Intro H'1; Right.
Cut (le y x); Auto with sets arith.
`Qed`.
`Hints` Resolve le_total_order.

`Lemma` Finite_subset_has_lub:
(X: (Ensemble nat)) (Finite nat X) ->
(EXT m: nat | (Upper_Bound nat nat_po X m)).
`Proof`.
Intros X H'; Elim H'.
Exists O.
Apply Upper_Bound_definition; Auto with sets arith.
Intros y H'0; Elim H'0; Auto with sets arith.
Intros A H'0 H'1 x H'2; Try Assumption.
Elim H'1; Intros x0 H'3; Clear H'1.
Elim le_total_order.
Simpl.
Intro H'1; Try Assumption.
LApply H'1; [Intro H'4; Idtac | Try Assumption]; Auto with sets arith.
Generalize (H'4 x0 x).
Clear H'4.
Clear H'1.
Intro H'1; LApply H'1;
[Intro H'4; Elim H'4;
[Intro H'5; Try Exact H'5; Clear H'4 H'1 | Intro H'5; Clear H'4 H'1] |
Clear H'1].
Exists x.
Apply Upper_Bound_definition; Auto with sets arith; Simpl.
Intros y H'1; Elim H'1.
Generalize le_trans.
Intro H'4; Red in H'4.
Intros x1 H'6; Try Assumption.
Apply H'4 with y := x0; Auto with sets arith.
Elim H'3; Simpl; Auto with sets arith.
Intros x1 H'4; Elim H'4; Auto with sets arith.
Exists x0.
Apply Upper_Bound_definition; Auto with sets arith; Simpl.
Intros y H'1; Elim H'1.
Intros x1 H'4; Try Assumption.
Elim H'3; Simpl; Auto with sets arith.
Intros x1 H'4; Elim H'4; Auto with sets arith.
Red.
Intros x1 H'1; Elim H'1; Auto with sets arith.
`Qed`.

`Lemma` Integers_has_no_ub: ~ (EXT m:nat | (Upper_Bound nat nat_po Integers m)).
`Proof`.
Red; Intro H'; Elim H'.
Intros x H'0.
Elim H'0; Intros H'1 H'2.
Cut (In nat Integers (S x)).
Intro H'3.
Specialize 1 H'2 with y := (S x); Intro H'4; LApply H'4;
[Intro H'5; Clear H'4 | Try Assumption; Clear H'4].
Simpl in H'5.
Absurd (le (S x) x); Auto with arith.
Auto with sets arith.
`Qed`.

`Lemma` Integers_infinite: ~ (Finite nat Integers).
`Proof`.
Generalize Integers_has_no_ub.
Intro H'; Red; Intro H'0; Try Exact H'0.
Apply H'.
Apply Finite_subset_has_lub; Auto with sets arith.
`Qed`.

`End` Integers_sect.

`

Index