位相空間
位相空間を定義する。
Require Import category. Require Import classical_logic. Require Import logic. Require Import power. Require Import function. Set Implicit Arguments.
定義
型 A 上の位相構造を以下のように定義する。
Record is_topology (A : Type) (is_open : power A -> Prop) : Prop := make_is_topology { top_open : is_open whole_set; bin_inter_open {U V} : is_open U -> is_open V -> is_open (U ∩ V); union_open {X : power (power A)} : (forall U, U ∈ X -> is_open U) -> is_open (⋃ X); }. Record topology (A : Type) : Type := make_topology { is_open : power A -> Prop; is_open_is_topology :> is_topology is_open; }.
位相構造は、A の元の集合がどのようなときに開集合であるかを is_open という述語によって指定する。A の元全体の集合は開集合である。開集合は2項の共通集合と、一般の合併によって閉じている。
位相空間とは、型とその上の位相の組である。
Record topological_space : Type :=
make_topological_space {
A :> Type;
topology_on_A :> topology A;
}.閉集合を定義する。
Definition is_closed (X : topological_space) (S : power X) : Prop := X.(is_open) (complement S).X: topological_spaceis_open X empty_setX: topological_spaceis_open X empty_setX: topological_spaceis_open X (⋃ empty_set)X: topological_spaceforall U : power X, U ∈ empty_set -> is_open X UX: topological_space
U: power X
H: U ∈ empty_setis_open X Ucontradiction. Qed.X: topological_space
U: power X
H: Falseis_open X U
例
どんな型も、その上に離散位相を考えることができる。
A: Typetopology AA: Typetopology AA: Typeis_topology (fun _ : power A => True)A: TypeTrueA: Typepower A -> power A -> True -> True -> TrueA: Typeforall X : power (power A), (forall U : power A, U ∈ X -> True) -> TrueA: TypeTruetrivial.A: TypeTrueA: Typepower A -> power A -> True -> True -> Truetrivial.A: Typepower A -> power A -> True -> True -> TrueA: Typeforall X : power (power A), (forall U : power A, U ∈ X -> True) -> Truetrivial. Defined.A: Typeforall X : power (power A), (forall U : power A, U ∈ X -> True) -> True
どんな型も、その上に密着位相を考えることができる。
A: Typeis_topology (fun S : power A => S = empty_set \/ S = whole_set)A: Typeis_topology (fun S : power A => S = empty_set \/ S = whole_set)A: Typewhole_set = empty_set \/ whole_set = whole_setA: Typeforall U V : power A, U = empty_set \/ U = whole_set -> V = empty_set \/ V = whole_set -> U ∩ V = empty_set \/ U ∩ V = whole_setA: Typeforall X : power (power A), (forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set) -> ⋃ X = empty_set \/ ⋃ X = whole_set
まず whole_set が開集合であることを示す。
A: Typewhole_set = empty_set \/ whole_set = whole_setreflexivity.A: Typewhole_set = whole_set
次に2項の共通集合で閉じていることを示す。
A: Typeforall U V : power A, U = empty_set \/ U = whole_set -> V = empty_set \/ V = whole_set -> U ∩ V = empty_set \/ U ∩ V = whole_setA: Type
U, V: power A
H: U = empty_set \/ U = whole_set
H0: V = empty_set \/ V = whole_setU ∩ V = empty_set \/ U ∩ V = whole_setA: Type
U, V: power A
H: U = empty_set
H0: V = empty_set \/ V = whole_setU ∩ V = empty_set \/ U ∩ V = whole_setA: Type
U, V: power A
H: U = whole_set
H0: V = empty_set \/ V = whole_setU ∩ V = empty_set \/ U ∩ V = whole_setA: Type
U, V: power A
H: U = empty_set
H0: V = empty_set \/ V = whole_setU ∩ V = empty_set \/ U ∩ V = whole_setA: Type
U, V: power A
H: U = empty_set
H0: V = empty_set \/ V = whole_setU ∩ V = empty_setapply bin_inter_empty_set_left.A: Type
V: power A
H0: V = empty_set \/ V = whole_setempty_set ∩ V = empty_setA: Type
U, V: power A
H: U = whole_set
H0: V = empty_set \/ V = whole_setU ∩ V = empty_set \/ U ∩ V = whole_setA: Type
U, V: power A
H: U = whole_set
H0: V = empty_setU ∩ V = empty_set \/ U ∩ V = whole_setA: Type
U, V: power A
H: U = whole_set
H0: V = whole_setU ∩ V = empty_set \/ U ∩ V = whole_setA: Type
U, V: power A
H: U = whole_set
H0: V = empty_setU ∩ V = empty_set \/ U ∩ V = whole_setA: Type
U, V: power A
H: U = whole_set
H0: V = empty_setU ∩ V = empty_setapply bin_inter_empty_set_right.A: Type
U: power A
H: U = whole_setU ∩ empty_set = empty_setA: Type
U, V: power A
H: U = whole_set
H0: V = whole_setU ∩ V = empty_set \/ U ∩ V = whole_setA: Type
U, V: power A
H: U = whole_set
H0: V = whole_setU ∩ V = whole_setapply bin_inter_left_unit.A: Typewhole_set ∩ whole_set = whole_set
最後に任意の合併で閉じていることを示す。
A: Typeforall X : power (power A), (forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set) -> ⋃ X = empty_set \/ ⋃ X = whole_setA: Type
X: power (power A)
H: forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set⋃ X = empty_set \/ ⋃ X = whole_setA: Type
X: power (power A)
H: forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set
H0: exists x : power A, x ∈ X /\ x = whole_set⋃ X = empty_set \/ ⋃ X = whole_setA: Type
X: power (power A)
H: forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set
H0: forall x : power A, ~ (x ∈ X /\ x = whole_set)⋃ X = empty_set \/ ⋃ X = whole_setA: Type
X: power (power A)
H: forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set
H0: exists x : power A, x ∈ X /\ x = whole_set⋃ X = empty_set \/ ⋃ X = whole_setA: Type
X: power (power A)
H: forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set
H0: exists x : power A, x ∈ X /\ x = whole_set⋃ X = whole_setA: Type
X: power (power A)
H: forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set
U: power A
H1: U ∈ X
H2: U = whole_set⋃ X = whole_setapply (union_whole_set H1).A: Type
X: power (power A)
H: forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set
U: power A
H1: whole_set ∈ X
H2: U = whole_set⋃ X = whole_setA: Type
X: power (power A)
H: forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set
H0: forall x : power A, ~ (x ∈ X /\ x = whole_set)⋃ X = empty_set \/ ⋃ X = whole_setA: Type
X: power (power A)
H: forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set
H0: forall x : power A, ~ (x ∈ X /\ x = whole_set)⋃ X = empty_setA: Type
X: power (power A)
H: forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set
H0: forall x : power A, ~ (x ∈ X /\ x = whole_set)⋃ X ⊆ empty_setA: Type
X: power (power A)
H: forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set
H0: forall x : power A, ~ (x ∈ X /\ x = whole_set)forall S : power A, S ∈ X -> S ⊆ empty_setA: Type
X: power (power A)
H: forall U : power A, U ∈ X -> U = empty_set \/ U = whole_set
H0: forall x : power A, ~ (x ∈ X /\ x = whole_set)
S: power A
H1: S ∈ XS ⊆ empty_setA: Type
X: power (power A)
S: power A
H: S = empty_set \/ S = whole_set
H0: forall x : power A, ~ (x ∈ X /\ x = whole_set)
H1: S ∈ XS ⊆ empty_setA: Type
X: power (power A)
S: power A
H: S = empty_set \/ S = whole_set
H0: ~ (S ∈ X /\ S = whole_set)
H1: S ∈ XS ⊆ empty_setA: Type
X: power (power A)
S: power A
H: S = empty_set \/ S = whole_set
H0: ~ (S ∈ X /\ S = whole_set)
H1: S ∈ X
H2: S <> whole_setS ⊆ empty_setA: Type
X: power (power A)
S: power A
H: S = empty_set \/ S = whole_set
H2: S <> whole_setS ⊆ empty_setA: Type
X: power (power A)
S: power A
H: S = empty_set \/ S = whole_set
H2: S = empty_setS ⊆ empty_setapply inclusion_refl. Qed.A: Type
X: power (power A)
S: power A
H: S = empty_set \/ S = whole_set
H2: S = empty_setempty_set ⊆ empty_set
これで離散位相が実際に位相であることが分かった。
A: Typetopology AA: Typetopology Aapply indiscrete_topology_is_topology. Defined.A: Typeis_topology (fun S : power A => S = empty_set \/ S = whole_set)
連続写像
Definition continuous {A B} (X : topology A) (Y : topology B) (f : A -> B) : Prop := forall U : power B, Y.(is_open _) U -> X.(is_open _) (preimage f U). Record continuous_map (X Y : topological_space) : Type := make_continuous_map { f :> X -> Y; f_is_continous :> continuous X Y f; }.A: Type
X: topology Acontinuous X X id_functionA: Type
X: topology Acontinuous X X id_functionA: Type
X: topology Aforall U : power A, is_open X U -> is_open X (preimage id_function U)A: Type
X: topology A
U: power A
H: is_open X Uis_open X (preimage id_function U)assumption. Qed.A: Type
X: topology A
U: power A
H: is_open X Uis_open X (fun a : A => U (id_function a))X: topological_spacecontinuous_map X XX: topological_spacecontinuous_map X Xapply identity_continuous. Defined.X: topological_spacecontinuous X X id_functionA, B, C: Type
X: topology A
Y: topology B
Z: topology C
f: A -> B
g: B -> C
g': continuous Y Z g
f': continuous X Y fcontinuous X Z (compose_functions g f)A, B, C: Type
X: topology A
Y: topology B
Z: topology C
f: A -> B
g: B -> C
g': continuous Y Z g
f': continuous X Y fcontinuous X Z (compose_functions g f)A, B, C: Type
X: topology A
Y: topology B
Z: topology C
f: A -> B
g: B -> C
g': continuous Y Z g
f': continuous X Y fforall U : power C, is_open Z U -> is_open X (preimage (compose_functions g f) U)A, B, C: Type
X: topology A
Y: topology B
Z: topology C
f: A -> B
g: B -> C
g': continuous Y Z g
f': continuous X Y f
U: power C
H: is_open Z Uis_open X (preimage (compose_functions g f) U)A, B, C: Type
X: topology A
Y: topology B
Z: topology C
f: A -> B
g: B -> C
g': continuous Y Z g
f': continuous X Y f
U: power C
H: is_open Z Uis_open X (preimage f (preimage g U))A, B, C: Type
X: topology A
Y: topology B
Z: topology C
f: A -> B
g: B -> C
g': continuous Y Z g
f': continuous X Y f
U: power C
H: is_open Z Uis_open Y (preimage g U)assumption. Qed.A, B, C: Type
X: topology A
Y: topology B
Z: topology C
f: A -> B
g: B -> C
g': continuous Y Z g
f': continuous X Y f
U: power C
H: is_open Z Uis_open Z UX, Y, Z: topological_space
g: continuous_map Y Z
f: continuous_map X Ycontinuous_map X ZX, Y, Z: topological_space
g: continuous_map Y Z
f: continuous_map X Ycontinuous_map X Zapply (composition_continuous g f). Defined.X, Y, Z: topological_space
g: continuous_map Y Z
f: continuous_map X Ycontinuous X Z (compose_functions g f)
位相空間の圏
displayed_category_data category_of_types_datadisplayed_category_data category_of_types_datacategory_of_types_data -> Typeforall a b : category_of_types_data, category_of_types_data [a, b] -> ?d_ob a -> ?d_ob b -> Typeforall (a : category_of_types_data) (x : ?d_ob a), ?d_hom a a id x xforall (a b c : category_of_types_data) (x : ?d_ob a) (y : ?d_ob b) (z : ?d_ob c) (g : category_of_types_data [b, c]) (f0 : category_of_types_data [a, b]), ?d_hom b c g y z -> ?d_hom a b f0 x y -> ?d_hom a c (g ∘ f0) x zexact topology.category_of_types_data -> Typeforall a b : category_of_types_data, category_of_types_data [a, b] -> topology a -> topology b -> Typeexact (continuous X Y f).A, B: category_of_types_data
f: category_of_types_data [A, B]
X: topology A
Y: topology BTypeforall (a : category_of_types_data) (x : topology a), (fun (A0 B : category_of_types_data) (f0 : category_of_types_data [A0, B]) (X : topology A0) (Y : topology B) => continuous X Y f0) a a id x xforall (a : Type) (x : topology a), continuous x x (fun x0 : a => x0)apply identity_continuous.a: Type
x: topology acontinuous x x (fun x0 : a => x0)forall (a b c : category_of_types_data) (x : topology a) (y : topology b) (z : topology c) (g : category_of_types_data [b, c]) (f0 : category_of_types_data [a, b]), (fun (A B : category_of_types_data) (f : category_of_types_data [A, B]) (X : topology A) (Y : topology B) => continuous X Y f) b c g y z -> (fun (A B : category_of_types_data) (f : category_of_types_data [A, B]) (X : topology A) (Y : topology B) => continuous X Y f) a b f0 x y -> (fun (A0 B : category_of_types_data) (f1 : category_of_types_data [A0, B]) (X : topology A0) (Y : topology B) => continuous X Y f1) a c (g ∘ f0) x zforall (a b c : Type) (x : topology a) (y : topology b) (z : topology c) (g : b -> c) (f0 : a -> b), continuous y z g -> continuous x y f0 -> continuous x z (fun x0 : a => g (f0 x0))apply (composition_continuous g' f'). Defined.a, b, c: Type
x: topology a
y: topology b
z: topology c
g: b -> c
f0: a -> b
g': continuous y z g
f': continuous x y f0continuous x z (fun x0 : a => g (f0 x0))
近傍
Section Neighborhoods. Context {X : topological_space}. Definition neighborhood (x : X) (N : power X) : Prop := exists U, X.(is_open) U /\ x ∈ U /\ U ⊆ N. Definition open_neighborhood (x : X) (U : power X) : Prop := X.(is_open) U /\ x ∈ U.X: topological_space
x: X
U: power Xopen_neighborhood x U -> neighborhood x UX: topological_space
x: X
U: power Xopen_neighborhood x U -> neighborhood x UX: topological_space
x: X
U: power X
H: open_neighborhood x Uneighborhood x UX: topological_space
x: X
U: power X
H: is_open X U
H0: x ∈ Uneighborhood x UX: topological_space
x: X
U: power X
H: is_open X U
H0: x ∈ Uis_open X U /\ x ∈ U /\ U ⊆ UX: topological_space
x: X
U: power X
H: is_open X U
H0: x ∈ Uis_open X UX: topological_space
x: X
U: power X
H: is_open X U
H0: x ∈ Ux ∈ UX: topological_space
x: X
U: power X
H: is_open X U
H0: x ∈ UU ⊆ Uassumption.X: topological_space
x: X
U: power X
H: is_open X U
H0: x ∈ Uis_open X Uassumption.X: topological_space
x: X
U: power X
H: is_open X U
H0: x ∈ Ux ∈ Uapply inclusion_refl. Qed.X: topological_space
x: X
U: power X
H: is_open X U
H0: x ∈ UU ⊆ UX: topological_space
x: X
U: power Xis_open X U -> neighborhood x U -> open_neighborhood x UX: topological_space
x: X
U: power Xis_open X U -> neighborhood x U -> open_neighborhood x UX: topological_space
x: X
U: power X
H: is_open X U
H0: neighborhood x Uopen_neighborhood x UX: topological_space
x: X
U: power X
H: is_open X U
H0: power X
H1: is_open X H0
H2: x ∈ H0
H3: H0 ⊆ Uopen_neighborhood x UX: topological_space
x: X
U: power X
H: is_open X U
H0: power X
H1: is_open X H0
H2: x ∈ H0
H3: H0 ⊆ Uis_open X UX: topological_space
x: X
U: power X
H: is_open X U
H0: power X
H1: is_open X H0
H2: x ∈ H0
H3: H0 ⊆ Ux ∈ Uassumption.X: topological_space
x: X
U: power X
H: is_open X U
H0: power X
H1: is_open X H0
H2: x ∈ H0
H3: H0 ⊆ Uis_open X UX: topological_space
x: X
U: power X
H: is_open X U
H0: power X
H1: is_open X H0
H2: x ∈ H0
H3: H0 ⊆ Ux ∈ Uassumption. Qed. End Neighborhoods.X: topological_space
x: X
U: power X
H: is_open X U
H0: power X
H1: is_open X H0
H2: x ∈ H0
H3: H0 ⊆ Ux ∈ H0
分離公理
Definition T1_space (X : topological_space) : Prop := forall x : X, is_closed X (singleton x). Definition hausdorff (X : topological_space) : Prop := forall x y : X, x <> y -> exists U V, open_neighborhood x U /\ open_neighborhood y V /\ disjoint U V.X: topological_spaceT1_space X -> forall x y : X, x <> y -> exists N : power X, open_neighborhood x N /\ ~ y ∈ NX: topological_spaceT1_space X -> forall x y : X, x <> y -> exists N : power X, open_neighborhood x N /\ ~ y ∈ NX: topological_space
H: T1_space X
x, y: X
H0: x <> yexists N : power X, open_neighborhood x N /\ ~ y ∈ NX: topological_space
y: X
H: is_closed X (singleton y)
x: X
H0: x <> yexists N : power X, open_neighborhood x N /\ ~ y ∈ NX: topological_space
y: X
H: is_open X (complement (singleton y))
x: X
H0: x <> yexists N : power X, open_neighborhood x N /\ ~ y ∈ NX: topological_space
y: X
H: is_open X (complement (singleton y))
x: X
H0: x <> yopen_neighborhood x (complement (singleton y)) /\ ~ y ∈ complement (singleton y)X: topological_space
y: X
H: is_open X (complement (singleton y))
x: X
H0: x <> yopen_neighborhood x (complement (singleton y))X: topological_space
y: X
H: is_open X (complement (singleton y))
x: X
H0: x <> y~ y ∈ complement (singleton y)X: topological_space
y: X
H: is_open X (complement (singleton y))
x: X
H0: x <> yopen_neighborhood x (complement (singleton y))X: topological_space
y: X
H: is_open X (complement (singleton y))
x: X
H0: x <> yis_open X (complement (singleton y))X: topological_space
y: X
H: is_open X (complement (singleton y))
x: X
H0: x <> yx ∈ complement (singleton y)assumption.X: topological_space
y: X
H: is_open X (complement (singleton y))
x: X
H0: x <> yis_open X (complement (singleton y))X: topological_space
y: X
H: is_open X (complement (singleton y))
x: X
H0: x <> yx ∈ complement (singleton y)assumption.X: topological_space
y: X
H: is_open X (complement (singleton y))
x: X
H0: x <> yx <> yX: topological_space
y: X
H: is_open X (complement (singleton y))
x: X
H0: x <> y~ y ∈ complement (singleton y)X: topological_space
y: X
H: is_open X (complement (singleton y))
x: X
H0: x <> y~ y <> yreflexivity. Qed.X: topological_space
y: X
H: is_open X (complement (singleton y))
x: X
H0: x <> yy = y
TODO: 以下の証明は明らかに読みにくい:
X: topological_space(forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N) -> T1_space XX: topological_space(forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N) -> T1_space XX: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ NT1_space XX: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ Nforall x : X, is_closed X (singleton x)X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ Nforall x : X, is_open X (complement (singleton x))X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: Xis_open X (complement (singleton x))X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: Xis_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))is_open X (complement (singleton x))X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: Xis_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: Xforall U : power X, U ∈ (fun S : power X => is_open X S /\ ~ x ∈ S) -> is_open X UX: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: Xforall U : power X, is_open X U /\ ~ U x -> is_open X UX: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
U: power X
H0: is_open X U /\ ~ U xis_open X Uassumption.X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
U: power X
H0: is_open X U
H1: ~ U xis_open X UX: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))is_open X (complement (singleton x))X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))complement (singleton x) = ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: complement (singleton x) = ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)is_open X (complement (singleton x))X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))complement (singleton x) = ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))complement (singleton x) ⊆ ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))⋃ (fun S : power X => is_open X S /\ ~ x ∈ S) ⊆ complement (singleton x)X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))complement (singleton x) ⊆ ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
y: X
H1: y ∈ complement (singleton x)y ∈ ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
y: X
H1: y <> xy ∈ ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)X: topological_space
x, y: X
H: exists N : power X, neighborhood y N /\ ~ x ∈ N
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: y <> xy ∈ ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)X: topological_space
x, y: X
N: power X
H: neighborhood y N
H2: ~ x ∈ N
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: y <> xy ∈ ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)X: topological_space
x, y: X
N, U: power X
H: is_open X U
H3: y ∈ U
H4: U ⊆ N
H2: ~ x ∈ N
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: y <> xy ∈ ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)X: topological_space
x, y: X
N, U: power X
H: is_open X U
H3: y ∈ U
H4: U ⊆ N
H2: ~ x ∈ N
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: y <> xU ∈ (fun S : power X => is_open X S /\ ~ x ∈ S) /\ y ∈ UX: topological_space
x, y: X
N, U: power X
H: is_open X U
H3: y ∈ U
H4: U ⊆ N
H2: ~ x ∈ N
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: y <> xis_open X UX: topological_space
x, y: X
N, U: power X
H: is_open X U
H3: y ∈ U
H4: U ⊆ N
H2: ~ x ∈ N
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: y <> x~ x ∈ UX: topological_space
x, y: X
N, U: power X
H: is_open X U
H3: y ∈ U
H4: U ⊆ N
H2: ~ x ∈ N
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: y <> xy ∈ Uassumption.X: topological_space
x, y: X
N, U: power X
H: is_open X U
H3: y ∈ U
H4: U ⊆ N
H2: ~ x ∈ N
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: y <> xis_open X UX: topological_space
x, y: X
N, U: power X
H: is_open X U
H3: y ∈ U
H4: U ⊆ N
H2: ~ x ∈ N
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: y <> x~ x ∈ UX: topological_space
x, y: X
N, U: power X
H: is_open X U
H3: y ∈ U
H4: U ⊆ N
H2: ~ x ∈ N
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: y <> x
H5: x ∈ UFalseX: topological_space
x, y: X
N, U: power X
H: is_open X U
H3: y ∈ U
H4: U ⊆ N
H2: ~ x ∈ N
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: y <> x
H5: x ∈ Ux ∈ Nassumption.X: topological_space
x, y: X
N, U: power X
H: is_open X U
H3: y ∈ U
H4: U ⊆ N
H2: ~ x ∈ N
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: y <> x
H5: x ∈ Ux ∈ Uassumption.X: topological_space
x, y: X
N, U: power X
H: is_open X U
H3: y ∈ U
H4: U ⊆ N
H2: ~ x ∈ N
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: y <> xy ∈ UX: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))⋃ (fun S : power X => is_open X S /\ ~ x ∈ S) ⊆ complement (singleton x)X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
y: X
H1: y ∈ ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)y ∈ complement (singleton x)X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
y: X
H1: y ∈ ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)y <> xX: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
y: X
U: power X
H1: U ∈ (fun S : power X => is_open X S /\ ~ x ∈ S)
H2: y ∈ Uy <> xX: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
y: X
U: power X
H1: U ∈ (fun S : power X => is_open X S /\ ~ x ∈ S)
H2: y ∈ U
H3: y = xFalseX: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
U: power X
H1: U ∈ (fun S : power X => is_open X S /\ ~ x ∈ S)
H2: x ∈ UFalseX: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
U: power X
H1: is_open X U /\ ~ U x
H2: x ∈ UFalseX: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
U: power X
H1: is_open X U
H3: ~ U x
H2: x ∈ UFalseassumption.X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
U: power X
H1: is_open X U
H3: ~ U x
H2: x ∈ UU xX: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: complement (singleton x) = ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)is_open X (complement (singleton x))apply H0. Qed.X: topological_space
H: forall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ N
x: X
H0: is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))
H1: complement (singleton x) = ⋃ (fun S : power X => is_open X S /\ ~ x ∈ S)is_open X (⋃ (fun S : power X => is_open X S /\ ~ x ∈ S))X: topological_spacehausdorff X -> T1_space XX: topological_spacehausdorff X -> T1_space XX: topological_space
H: hausdorff XT1_space XX: topological_space
H: hausdorff Xforall x y : X, x <> y -> exists N : power X, neighborhood x N /\ ~ y ∈ NX: topological_space
H: hausdorff X
x, y: X
H0: x <> yexists N : power X, neighborhood x N /\ ~ y ∈ NX: topological_space
x, y: X
H: exists U V : power X, open_neighborhood x U /\ open_neighborhood y V /\ disjoint U V
H0: x <> yexists N : power X, neighborhood x N /\ ~ y ∈ NX: topological_space
x, y: X
U, V: power X
H: open_neighborhood x U
H1: open_neighborhood y V
H2: disjoint U V
H0: x <> yexists N : power X, neighborhood x N /\ ~ y ∈ NX: topological_space
x, y: X
U, V: power X
H: open_neighborhood x U
H1: open_neighborhood y V
H2: disjoint U V
H0: x <> yneighborhood x U /\ ~ y ∈ UX: topological_space
x, y: X
U, V: power X
H: open_neighborhood x U
H1: open_neighborhood y V
H2: disjoint U V
H0: x <> yneighborhood x UX: topological_space
x, y: X
U, V: power X
H: open_neighborhood x U
H1: open_neighborhood y V
H2: disjoint U V
H0: x <> y~ y ∈ UX: topological_space
x, y: X
U, V: power X
H: open_neighborhood x U
H1: open_neighborhood y V
H2: disjoint U V
H0: x <> yneighborhood x Uassumption.X: topological_space
x, y: X
U, V: power X
H: open_neighborhood x U
H1: open_neighborhood y V
H2: disjoint U V
H0: x <> yopen_neighborhood x UX: topological_space
x, y: X
U, V: power X
H: open_neighborhood x U
H1: open_neighborhood y V
H2: disjoint U V
H0: x <> y~ y ∈ UX: topological_space
x, y: X
U, V: power X
H: open_neighborhood x U
H1: open_neighborhood y V
H2: disjoint U V
H0: x <> y
H3: y ∈ UFalseX: topological_space
x, y: X
U, V: power X
H: open_neighborhood x U
H1: open_neighborhood y V
H2: forall x : X, x ∈ U -> x ∈ V -> False
H0: x <> y
H3: y ∈ UFalseX: topological_space
x, y: X
U, V: power X
H: is_open X U
H4: x ∈ U
H1: open_neighborhood y V
H2: forall x : X, x ∈ U -> x ∈ V -> False
H0: x <> y
H3: y ∈ UFalseX: topological_space
x, y: X
U, V: power X
H: is_open X U
H4: x ∈ U
H1: is_open X V
H5: y ∈ V
H2: forall x : X, x ∈ U -> x ∈ V -> False
H0: x <> y
H3: y ∈ UFalseassumption. Qed.X: topological_space
x, y: X
U, V: power X
H: is_open X U
H4: x ∈ U
H1: is_open X V
H5: y ∈ V
H2: False
H0: x <> y
H3: y ∈ UFalse