@@ -26,6 +26,7 @@ From mathcomp Require Import mathcomp_extra boolp classical_sets functions.
2626(* <-> exists X : {fset T}, A = [set` X] *)
2727(* <-> ~ ([set: nat] #<= A) *)
2828(* infinite_set A := ~ finite_set A *)
29+ (* cofinite_set A := finite_set (~` A) *)
2930(* countable A <-> A is countable *)
3031(* := A #<= [set: nat] *)
3132(* fset_set A == the finite set corresponding if A : set T is finite, *)
@@ -68,6 +69,7 @@ Notation "A '#!=' B" := (~~ (card_eq A B)) : card_scope.
6869
6970Definition finite_set {T} (A : set T) := exists n, A #= `I_n.
7071Notation infinite_set A := (~ finite_set A).
72+ Notation cofinite_set A := (finite_set (~` A)).
7173
7274Lemma injPex {T U} {A : set T} :
7375 $|{inj A >-> U}| <-> exists f : T -> U, set_inj A f.
@@ -412,6 +414,7 @@ apply/idP/idP=> [/card_leP[f]|?];
412414by have /leq_card := in2TT 'inj_(IIord \o f \o IIord^-1); rewrite !card_ord.
413415Qed .
414416
417+
415418Lemma ocard_eqP {T U} {A : set T} {B : set U} :
416419 reflect $|{bij A >-> some @` B}| (A #= B).
417420Proof .
@@ -515,6 +518,13 @@ Lemma finite_set0 T : finite_set (set0 : set T).
515518Proof . by apply/finite_setP; exists 0%N; rewrite II0. Qed .
516519#[global] Hint Resolve finite_set0 : core.
517520
521+ Lemma cofinite_setT T : cofinite_set [set: T].
522+ Proof . by rewrite setCT. Qed .
523+ #[global] Hint Resolve cofinite_setT : core.
524+
525+ Lemma infinite_setN0 {T} (A : set T) : infinite_set A -> A !=set0.
526+ Proof . by rewrite -set0P; apply: contra_not_neq => ->. Qed .
527+
518528Lemma finite_seqP {T : eqType} A :
519529 finite_set A <-> exists s : seq T, A = [set` s].
520530Proof .
@@ -602,6 +612,14 @@ Lemma sub_finite_set T (A B : set T) : A `<=` B ->
602612 finite_set B -> finite_set A.
603613Proof . by move=> ?; apply/card_le_finite/subset_card_le. Qed .
604614
615+ Lemma sub_cofinite_set T (A B : set T) : A `<=` B ->
616+ cofinite_set A -> cofinite_set B.
617+ Proof . by move=> /subsetC/sub_finite_set. Qed .
618+
619+ Lemma sub_infinite_set T (A B : set T) : A `<=` B ->
620+ infinite_set A -> infinite_set B.
621+ Proof . by move=> AB; apply/contra_not/sub_finite_set. Qed .
622+
605623Lemma finite_set_leP T (A : set T) : finite_set A <-> exists n, A #<= `I_n.
606624Proof .
607625split=> [[n /card_eqPle[]]|[n leAn]]; first by exists n.
@@ -657,6 +675,16 @@ Qed.
657675Lemma finite_setD T (A B : set T) : finite_set A -> finite_set (A `\` B).
658676Proof . exact/card_le_finite/card_le_setD. Qed .
659677
678+ Lemma cofinite_setUl T (A B : set T) : cofinite_set A -> cofinite_set (A `|` B).
679+ Proof . by rewrite setCU -setDE; apply: finite_setD. Qed .
680+
681+ Lemma cofinite_setUr T (A B : set T) : cofinite_set B -> cofinite_set (A `|` B).
682+ Proof . by rewrite setUC; apply: cofinite_setUl. Qed .
683+
684+ Lemma cofinite_setU T (A B : set T) :
685+ cofinite_set A \/ cofinite_set B -> cofinite_set (A `|` B).
686+ Proof . by move=> [/cofinite_setUl|/cofinite_setUr]. Qed .
687+
660688Lemma finite_setU T (A B : set T) :
661689 finite_set (A `|` B) = (finite_set A /\ finite_set B).
662690Proof .
@@ -665,6 +693,10 @@ pose fP := @finite_fsetP {classic T}; rewrite propeqE; split.
665693by case=> /fP[X->]/fP[Y->]; apply/fP; exists (X `|` Y)%fset; rewrite set_fsetU.
666694Qed .
667695
696+ Lemma cofinite_setI T (A B : set T) :
697+ cofinite_set (A `&` B) = (cofinite_set A /\ cofinite_set B).
698+ Proof . by rewrite setCI finite_setU. Qed .
699+
668700Lemma finite_set2 T (x y : T) : finite_set [set x; y].
669701Proof . by rewrite !finite_setU; split; apply: finite_set1. Qed .
670702#[global] Hint Resolve finite_set2 : core.
@@ -855,6 +887,10 @@ have Gy : y \in G k by rewrite in_fset_set ?inE//; apply: Ffin.
855887by exists (Tagged G [` Gy]%fset).
856888Qed .
857889
890+ Lemma cofinite_set_infinite {T} (A : set T) : infinite_set [set: T] ->
891+ cofinite_set A -> infinite_set A.
892+ Proof . by move=> + ACfin Afin; apply; rewrite -(setvU A) finite_setU. Qed .
893+
858894Lemma trivIset_sum_card (T : choiceType) (F : nat -> set T) n :
859895 (forall n, finite_set (F n)) -> trivIset [set: nat] F ->
860896 (\sum_(i < n) #|` fset_set (F i)| =
@@ -1025,6 +1061,14 @@ have : finite_set ((A `&` ~` B) `|` B) by rewrite finite_setU.
10251061by rewrite setUIl setUCl setIT finite_setU => -[].
10261062Qed .
10271063
1064+ Lemma infinite_setIl {T} (A B : set T) :
1065+ infinite_set A -> cofinite_set B -> infinite_set (A `&` B).
1066+ Proof . by move=> /infinite_setD/[apply]; rewrite setDE setCK. Qed .
1067+
1068+ Lemma infinite_setIr {T} (A B : set T) :
1069+ cofinite_set A -> infinite_set B -> infinite_set (A `&` B).
1070+ Proof . by rewrite setIC => *; apply: infinite_setIl. Qed .
1071+
10281072Lemma infinite_set_fset {T : choiceType} (A : set T) n :
10291073 infinite_set A ->
10301074 exists2 B : {fset T}, [set` B] `<=` A & (#|` B| >= n)%N.
@@ -1119,6 +1163,13 @@ Proof. by rewrite -setXTT; apply: infinite_setX; exact: infinite_nat. Qed.
11191163Lemma card_nat2 : [set: nat * nat] #= [set: nat].
11201164Proof . exact/eq_card_nat/infinite_prod_nat/countableP. Qed .
11211165
1166+ Lemma injective_gtn (f : nat -> nat) : injective f -> forall (n : nat), exists m, (n < f m)%N.
1167+ Proof .
1168+ move=> fI n; suff [m /negP] : ~` (f @^-1` `I_n.+1) !=set0 by rewrite -ltnNge; exists m.
1169+ apply: infinite_setN0; apply: cofinite_set_infinite; first exact: infinite_nat.
1170+ by rewrite setCK; apply: finite_preimage; first by move=> ? ? ? ?; apply: fI.
1171+ Qed .
1172+
11221173HB.instance Definition _ := isPointed.Build rat 0.
11231174
11241175Lemma infinite_rat : infinite_set [set: rat].
0 commit comments