Skip to content

Commit bd08c83

Browse files
committed
Compact Hausdorff implies normal. Without choice
By juggling around, one can prove "compact Hausdorff spaces are normal" without using choice. The relevant facts are, that "compactness is a kind of choice property" and "finite sets have choice (exploitable by induction)". The lemma `compact_Hausdorff_impl_T3_sep_lemma` should get another name and be moved to ZornsLemma. The approach of the proof is pretty clear (whatever that means), and the new proof has about the same length as the one based on choice (not counting the new lemmas). I created a new file `Finite_sets.v` (in allusion to the corresponding file in the stdlib), because we don't have a file yet that is *only* concerned with `Finite`. The best would have been `FiniteTypes.v`, but this is all about `FiniteT`.
1 parent e0d2b41 commit bd08c83

File tree

3 files changed

+185
-193
lines changed

3 files changed

+185
-193
lines changed

_CoqProject

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ theories/ZornsLemma/Families.v
5151
theories/ZornsLemma/Filters.v
5252
theories/ZornsLemma/FiniteImplicit.v
5353
theories/ZornsLemma/FiniteIntersections.v
54+
theories/ZornsLemma/Finite_sets.v
5455
theories/ZornsLemma/FiniteTypes.v
5556
theories/ZornsLemma/FunctionProperties.v
5657
theories/ZornsLemma/Image.v

theories/Topology/Compactness.v

Lines changed: 133 additions & 193 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
From Coq Require Import Program.Subset.
2-
From ZornsLemma Require Import EnsemblesTactics Powerset_facts.
3-
Require Export TopologicalSpaces Nets FilterLimits Homeomorphisms SeparatednessAxioms SubspaceTopology.
4-
Require Import FiltersAndNets ClassicalChoice.
1+
From Coq Require Import ClassicalChoice Program.Subset.
2+
From ZornsLemma Require Import EnsemblesTactics Finite_sets Powerset_facts.
3+
From Topology Require Export TopologicalSpaces Nets FilterLimits Homeomorphisms SeparatednessAxioms SubspaceTopology.
4+
From Topology Require Import FiltersAndNets.
55
Set Asymmetric Patterns.
66

77
Definition compact (X:TopologicalSpace) :=
@@ -382,6 +382,47 @@ assert (x = x0).
382382
now subst.
383383
Qed.
384384

385+
(* Every closed subset of a compact space is compact, but avoid
386+
mentioning the subspace topology. *)
387+
Lemma closed_compact_ens (X : TopologicalSpace) (S : Ensemble X) :
388+
compact X -> closed S ->
389+
forall F : Family X,
390+
(forall U, In F U -> open U) ->
391+
Included S (FamilyUnion F) ->
392+
exists C,
393+
Finite C /\ Included C F /\
394+
Included S (FamilyUnion C).
395+
Proof.
396+
intros X_compact S_closed cover_of_S cover_open cover_covers.
397+
specialize (X_compact (Union cover_of_S (Singleton (Complement S))))
398+
as [fincover [Hfincover0 [Hfincover1 Hfincover2]]].
399+
{ intros. destruct H; auto.
400+
destruct H. auto.
401+
}
402+
{ rewrite family_union_union.
403+
rewrite family_union_singleton.
404+
apply union_complement_included_l.
405+
assumption.
406+
}
407+
exists (Intersection cover_of_S fincover); repeat split.
408+
- apply Intersection_preserves_finite.
409+
assumption.
410+
- intros U HU.
411+
apply Intersection_decreases_l in HU.
412+
assumption.
413+
- intros x Hx.
414+
assert (In (FamilyUnion fincover) x).
415+
{ rewrite Hfincover2. constructor. }
416+
destruct H. exists S0; auto.
417+
split; auto.
418+
apply Hfincover1 in H.
419+
destruct H.
420+
2: {
421+
destruct H; contradiction.
422+
}
423+
assumption.
424+
Qed.
425+
385426
Lemma closed_compact: forall (X:TopologicalSpace) (S:Ensemble X),
386427
compact X -> closed S -> compact (SubspaceTopology S).
387428
Proof.
@@ -458,206 +499,105 @@ Proof.
458499
intros X HX_compact HX_Hausdorff.
459500
split.
460501
{ now apply Hausdorff_impl_T1_sep. }
461-
destruct (choice (fun (xy:{xy:X * X |
462-
let (x,y):=xy in x <> y})
463-
(UV:Ensemble X * Ensemble X) =>
464-
match xy with | exist (x,y) i =>
465-
let (U,V):=UV in
466-
open U /\ open V /\ In U x /\ In V y /\ Intersection U V = Empty_set
467-
end)) as
468-
[choice_fun Hchoice_fun].
469-
{ destruct x as [[x y] i].
470-
destruct (HX_Hausdorff _ _ i) as [U [V]].
471-
now exists (U, V).
472-
}
473-
pose (choice_fun_U := fun (x y:X)
474-
(Hineq:x<>y) => fst (choice_fun (exist _ (x,y) Hineq))).
475-
pose (choice_fun_V := fun (x y:X)
476-
(Hineq:x<>y) => snd (choice_fun (exist _ (x,y) Hineq))).
477-
assert (forall (x y:X) (Hineq:x<>y),
478-
open (choice_fun_U x y Hineq) /\
479-
open (choice_fun_V x y Hineq) /\
480-
In (choice_fun_U x y Hineq) x /\
481-
In (choice_fun_V x y Hineq) y /\
482-
Intersection (choice_fun_U x y Hineq) (choice_fun_V x y Hineq) = Empty_set)
483-
as HUV.
484-
{ intros.
485-
unfold choice_fun_U; unfold choice_fun_V.
486-
pose proof (Hchoice_fun (exist _ (x,y) Hineq)).
487-
now destruct (choice_fun (exist _ (x,y) Hineq)).
488-
}
489-
clearbody choice_fun_U choice_fun_V; clear choice_fun Hchoice_fun.
490-
intros x F HF_closed HFx.
491-
pose proof (closed_compact _ _ HX_compact HF_closed) as HF_compact.
492-
assert (forall y:X, In F y -> x <> y) as HF_neq_x.
493-
{ intros. congruence.
502+
intros x F HF HFx.
503+
pose (P := fun y => (fun p : Ensemble X * Ensemble X =>
504+
open (fst p) /\ open (snd p) /\
505+
Intersection (fst p) (snd p) = Empty_set /\
506+
In (fst p) x /\ In (snd p) y)).
507+
pose (cover_of_F := fun V => exists U y, In (P y) (U, V)).
508+
509+
assert (forall V, In cover_of_F V -> open V) as Hcover_open.
510+
{ intros V HV.
511+
destruct HV as [U [y []]].
512+
intuition.
494513
}
495-
pose (cover := fun (y:SubspaceTopology F) =>
496-
let (y,i):=y in inverse_image (subspace_inc F)
497-
(choice_fun_V x y (HF_neq_x y i))).
498-
destruct (compactness_on_indexed_covers _ _ cover HF_compact)
499-
as [subcover []].
500-
{ destruct a as [y i].
501-
apply subspace_inc_continuous, HUV.
514+
destruct (closed_compact_ens X F HX_compact HF cover_of_F) as
515+
[fincover [Hfincover0 [Hfincover1 Hfincover2]]]; auto.
516+
{ intros y Hy.
517+
specialize (HX_Hausdorff x y) as [U [V [HU [HV [HUx [HVx0]]]]]].
518+
{ intros ?. subst. contradiction. }
519+
exists V; auto.
520+
exists U, y.
521+
repeat split; auto.
502522
}
503-
{ apply Extensionality_Ensembles; split; red; intros y ?.
504-
{ constructor. }
505-
exists y.
506-
destruct y as [y i].
507-
simpl.
508-
constructor.
509-
simpl.
510-
apply HUV.
511-
}
512-
exists (IndexedIntersection
513-
(fun y:{y:SubspaceTopology F | In subcover y} =>
514-
let (y,_):=y in let (y,i):=y in choice_fun_U x y (HF_neq_x y i))).
515-
exists (IndexedUnion
516-
(fun y:{y:SubspaceTopology F | In subcover y} =>
517-
let (y,_):=y in let (y,i):=y in choice_fun_V x y (HF_neq_x y i))).
518-
repeat split.
519-
- apply open_finite_indexed_intersection.
520-
+ now apply Finite_ens_type.
521-
+ destruct a as [[y]].
522-
apply HUV.
523-
- apply open_indexed_union.
524-
destruct a as [[y]].
525-
apply HUV.
526-
- destruct a as [[y]].
527-
apply HUV.
528-
- red; intros y ?.
529-
assert (In (IndexedUnion
530-
(fun y:{y:SubspaceTopology F | In subcover y} =>
531-
cover (proj1_sig y))) (exist _ y H1)).
532-
{ rewrite H0. constructor. }
533-
remember (exist (In F) y H1) as ysig.
534-
destruct H2 as [[y']].
535-
rewrite Heqysig in H2; clear x0 Heqysig.
536-
simpl in H2.
537-
destruct y' as [y'].
538-
simpl in H2.
539-
destruct H2.
540-
simpl in H2.
541-
now exists (exist _ (exist _ y' i0) i).
542-
- apply Extensionality_Ensembles; split; auto with sets; red; intros y ?.
543-
destruct H1.
544-
destruct H1.
545-
destruct H2.
546-
pose proof (H1 a).
547-
destruct a as [[y]].
548-
replace (@Empty_set X) with
549-
(Intersection (choice_fun_U x y (HF_neq_x y i))
550-
(choice_fun_V x y (HF_neq_x y i))).
551-
+ now constructor.
552-
+ apply HUV.
523+
524+
(* recover the corresponding sets *)
525+
destruct (finite_ens_pair_choice
526+
fincover (fun V U => exists y, In (P y) (U, V)))
527+
as [fincomplement [Hfincomplement0 [Hfincomplement1 Hfincomplement2]]];
528+
auto.
529+
(* finish the proof *)
530+
exists (FamilyIntersection fincomplement), (FamilyUnion fincover).
531+
repeat split; auto using open_family_union.
532+
1: apply open_finite_family_intersection; auto.
533+
(* the other properties follow from [Hfincomplement2] and the def. of [P] *)
534+
1,2: intros V H0; specialize (Hfincomplement2 V H0) as [? [? [? []]]];
535+
intuition.
536+
537+
(* disjointness needs some work *)
538+
apply Extensionality_Ensembles; split;
539+
auto with sets; red; intros.
540+
destruct H. destruct H. destruct H0 as [S ? HS_fincover].
541+
specialize (Hfincomplement1 S HS_fincover)
542+
as [U [? [y []]]].
543+
intuition. simpl in *.
544+
specialize (H U H1).
545+
rewrite <- H3.
546+
split; assumption.
553547
Qed.
554548

555549
Lemma compact_Hausdorff_impl_normal_sep: forall X:TopologicalSpace,
556550
compact X -> Hausdorff X -> normal_sep X.
557551
Proof.
558-
intros.
559-
pose proof (compact_Hausdorff_impl_T3_sep X H H0).
560-
destruct (choice (fun (xF:{p:X * Ensemble X |
561-
let (x,F):=p in closed F /\ ~ In F x})
562-
(UV:Ensemble X * Ensemble X) =>
563-
let (p,i):=xF in let (x,F):=p in
564-
let (U,V):=UV in
565-
open U /\ open V /\ In U x /\ Included F V /\
566-
Intersection U V = Empty_set)) as [choice_fun].
567-
{ destruct x as [[x F] []].
568-
destruct H1.
569-
destruct (H4 x F H2 H3) as [U [V]].
570-
now exists (U, V).
571-
}
572-
pose (choice_fun_U := fun (x:X) (F:Ensemble X)
573-
(HC:closed F) (Hni:~ In F x) =>
574-
fst (choice_fun (exist _ (x,F) (conj HC Hni)))).
575-
pose (choice_fun_V := fun (x:X) (F:Ensemble X)
576-
(HC:closed F) (Hni:~ In F x) =>
577-
snd (choice_fun (exist _ (x,F) (conj HC Hni)))).
578-
assert (forall (x:X) (F:Ensemble X)
579-
(HC:closed F) (Hni:~ In F x),
580-
open (choice_fun_U x F HC Hni) /\
581-
open (choice_fun_V x F HC Hni) /\
582-
In (choice_fun_U x F HC Hni) x /\
583-
Included F (choice_fun_V x F HC Hni) /\
584-
Intersection (choice_fun_U x F HC Hni) (choice_fun_V x F HC Hni) =
585-
Empty_set).
586-
{ intros.
587-
pose proof (H2 (exist _ (x,F) (conj HC Hni))).
588-
unfold choice_fun_U, choice_fun_V.
589-
now destruct (choice_fun (exist _ (x,F) (conj HC Hni))).
590-
}
591-
clearbody choice_fun_U choice_fun_V; clear choice_fun H2.
592-
split.
593-
{ apply H1. }
594-
intros.
595-
pose proof (closed_compact _ _ H H2).
596-
assert (forall x:X, In F x -> ~ In G x).
597-
{ intros.
598-
intro.
599-
absurd (In Empty_set x).
600-
- easy.
601-
- now rewrite <- H5.
602-
}
552+
intros X HX_compact HX_Hausdorff.
553+
apply compact_Hausdorff_impl_T3_sep in HX_Hausdorff as [HX_T1 HX_regular];
554+
try assumption.
555+
split; try assumption.
556+
intros F G HF_closed HG_closed HFG_disjoint.
557+
pose (P := fun y => (fun p : Ensemble X * Ensemble X =>
558+
open (fst p) /\ open (snd p) /\
559+
Intersection (fst p) (snd p) = Empty_set /\
560+
In (fst p) y /\ Included G (snd p))).
561+
pose (cover_of_F := fun U => exists V y, In (P y) (U, V)).
603562

604-
pose (cover := fun x:SubspaceTopology F =>
605-
let (x,i):=x in inverse_image (subspace_inc F)
606-
(choice_fun_U x G H4 (H7 x i))).
607-
destruct (compactness_on_indexed_covers _ _ cover H6) as [subcover []].
608-
{ destruct a as [x i].
609-
apply subspace_inc_continuous, H3.
563+
assert (forall U, In cover_of_F U -> open U) as Hcover_open.
564+
{ intros U HU.
565+
destruct HU as [V [y []]].
566+
intuition.
610567
}
611-
{ apply Extensionality_Ensembles; split; red; intros.
612-
{ constructor. }
613-
exists x.
614-
destruct x.
615-
simpl cover.
616-
constructor.
617-
simpl.
618-
apply H3.
568+
destruct (closed_compact_ens X F HX_compact HF_closed cover_of_F) as
569+
[fincover [Hfincover0 [Hfincover1 Hfincover2]]]; auto.
570+
{ intros y Hy.
571+
specialize (HX_regular y G) as [U [V [HU [HV [HUx [HVx0]]]]]];
572+
auto.
573+
{ intros ?.
574+
assert (In Empty_set y); try contradiction.
575+
rewrite <- HFG_disjoint; split; assumption.
576+
}
577+
exists U; auto.
578+
exists V, y.
579+
repeat split; auto.
619580
}
620-
exists (IndexedUnion
621-
(fun x:{x:SubspaceTopology F | In subcover x} =>
622-
let (x,i):=proj1_sig x in choice_fun_U x G H4 (H7 x i))).
623-
exists (IndexedIntersection
624-
(fun x:{x:SubspaceTopology F | In subcover x} =>
625-
let (x,i):=proj1_sig x in choice_fun_V x G H4 (H7 x i))).
626-
repeat split.
627-
- apply open_indexed_union.
628-
destruct a as [[x]].
629-
simpl.
630-
apply H3.
631-
- apply open_finite_indexed_intersection.
632-
+ apply Finite_ens_type; trivial.
633-
+ destruct a as [[x]].
634-
simpl.
635-
apply H3.
636-
- intros x ?.
637-
assert (In (@Full_set (SubspaceTopology F)) (exist _ x H10))
638-
by constructor.
639-
rewrite <- H9 in H11.
640-
remember (exist _ x H10) as xsig.
641-
destruct H11.
642-
destruct a as [x'].
643-
destruct x' as [x'].
644-
rewrite Heqxsig in H11; clear x0 Heqxsig.
645-
simpl in H11.
646-
destruct H11.
647-
now exists (exist _ (exist _ x' i0) i).
648-
- destruct a as [x'].
649-
simpl.
650-
destruct x' as [x'].
651-
assert (Included G (choice_fun_V x' G H4 (H7 x' i0))) by apply H3.
581+
582+
destruct (finite_ens_pair_choice
583+
fincover (fun U V => exists y, In (P y) (U, V)))
584+
as [fincomplement [Hfincomplement0 [Hfincomplement1 Hfincomplement2]]];
652585
auto.
653-
- extensionality_ensembles.
654-
specialize H11 with a.
655-
destruct a as [[x']].
656-
simpl in H11, H10.
657-
replace (@Empty_set X) with (Intersection
658-
(choice_fun_U x' G H4 (H7 x' i))
659-
(choice_fun_V x' G H4 (H7 x' i))) by apply H3.
660-
now split.
586+
exists (FamilyUnion fincover), (FamilyIntersection fincomplement).
587+
repeat split; auto using open_family_union.
588+
1: apply open_finite_family_intersection; auto.
589+
1,2: intros V H0; specialize (Hfincomplement2 V H0) as [? [? [? []]]];
590+
intuition.
591+
592+
apply Extensionality_Ensembles; split;
593+
auto with sets; red; intros.
594+
destruct H. destruct H0. destruct H as [S ? HS_fincover].
595+
specialize (Hfincomplement1 S HS_fincover)
596+
as [U [? [y []]]].
597+
intuition. simpl in *.
598+
specialize (H0 U H1).
599+
rewrite <- H3.
600+
split; assumption.
661601
Qed.
662602

663603
Lemma topological_property_compact :

0 commit comments

Comments
 (0)