Skip to content

Commit 9b2e906

Browse files
committed
wedge stuff suitably generalized
1 parent e61713a commit 9b2e906

File tree

1 file changed

+142
-153
lines changed

1 file changed

+142
-153
lines changed

theories/function_spaces.v

Lines changed: 142 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -1700,6 +1700,7 @@ Definition wedge := {eq_quot wedge_rel}.
17001700
Definition wedgei (i : I) : X i -> wedge := \pi_wedge \o (existT X i).
17011701

17021702
HB.instance Definition _ := Topological.copy wedge (quotient_topology wedge).
1703+
HB.instance Definition _ := Quotient.on wedge.
17031704
Global Opaque wedge.
17041705

17051706
Lemma wedgei_continuous (i : I) : continuous (@wedgei i).
@@ -1788,16 +1789,7 @@ move=> i x; case: (pselect (x = p0 i)).
17881789
move=> ->; rewrite wedge_point_nbhs => /=; apply: WedgeIsPoint.
17891790
by move/eqP => xpi; rewrite /= -wedgei_nbhs //; apply: WedgeNotPoint.
17901791
Qed.
1791-
(*
1792-
Lemma wedger_reprE (b : Y) :
1793-
repr (wedger b) = inr b \/ (repr (wedger b) = inl x0 /\ b = y0).
1794-
Proof.
1795-
case: piP; case=> [l|r] /eqmodP /orP []; first by move/eqP => ->; left.
1796-
- by case/orP=> /andP []/eqP // [] -> /eqP [] ->; right.
1797-
- by move/eqP ->; left.
1798-
by case/orP => /andP [] /eqP //.
1799-
Qed.
1800-
*)
1792+
18011793
Definition wedge_fun {Z : Type} (f : forall i, X i -> Z) : wedge -> Z :=
18021794
sum_fun f \o repr.
18031795

@@ -1811,18 +1803,6 @@ move=> a b /eqmodP /orP [ /eqP -> // | /andP [/eqP +] /eqP +].
18111803
by rewrite /sum_fun /= => -> ->; exact: fE.
18121804
Qed.
18131805

1814-
(*
1815-
Lemma wedgel_reprE (a : X) :
1816-
repr (wedgel a) = inl a \/ (repr (wedgel a) = inr y0 /\ a = x0).
1817-
Proof.
1818-
case: piP; case=> [l|r] /eqmodP /orP []; first by case/eqP => ->; left.
1819-
- by case/orP=> /andP [/eqP ->] /eqP -> //.
1820-
- by move/eqP.
1821-
case/orP => /andP [/eqP]; first by case=> -> /eqP ->; right.
1822-
by move=> -> /eqP -> //.
1823-
Qed.
1824-
*)
1825-
18261806
Lemma wedge_fun_wedgei {Z : Type} (f : forall i, X i -> Z) i0 (a : X i0):
18271807
(forall i j, f i (p0 i) = f j (p0 j)) -> wedge_fun f (wedgei a) = f i0 a.
18281808
Proof.
@@ -1837,131 +1817,134 @@ rewrite -subTset=> z _; rewrite -[z]reprK; exists (projT1 (repr z)) => //.
18371817
by exists (projT2 (repr z)); rewrite // reprK /wedgei /= -sigT_eta reprK.
18381818
Qed.
18391819

1840-
Definition wedge_prod : topologicalType :=
1841-
\bigcup_i [set: X] `*` [set y0] `|` [set x0] `*` [set: Y].
1842-
1843-
Lemma wedge_prodl (x : X) : (x,y0) \in
1844-
([set: X] `*` [set y0] `|` [set x0] `*` [set: Y]).
1845-
Proof. by apply/mem_set; left. Qed.
1846-
1847-
Lemma wedge_prodr (y : Y) : (x0,y) \in
1848-
([set: X] `*` [set y0] `|` [set x0] `*` [set: Y]).
1849-
Proof. by apply/mem_set; right. Qed.
1850-
1851-
Definition wedge_prod_fun : wedge -> wedge_prod :=
1852-
wedge_fun
1853-
(fun x => @exist _ _ (x,y0) (wedge_prodl x))
1854-
(fun y => @exist _ _ (x0,y) (wedge_prodr y)).
1855-
Lemma wedge_prod_fun_bij : bijective wedge_prod_fun.
1856-
Proof.
1857-
have pE : ((fun x => @exist _ _ (x,y0) (wedge_prodl x)) x0) =
1858-
((fun y => @exist _ _ (x0,y) (wedge_prodr y))) y0 :> wedge_prod.
1859-
exact: eq_exist.
1860-
rewrite -setTT_bijective; split => //.
1861-
move=> a b _ _; rewrite -[a](@reprK _ wedge) -[b](@reprK _ wedge).
1862-
case Ea : (repr a) => [l1|r1]; case Eb : (repr b) => [l2|r2].
1863-
- rewrite /wedge_prod_fun /= ?wedge_funl //=.
1864-
by move=> R; have [ ->] := EqdepFacts.eq_sig_fst R.
1865-
- rewrite /wedge_prod_fun /= ?wedge_funl //= ?wedge_funr //.
1866-
by move=> R; have [-> <-] := EqdepFacts.eq_sig_fst R; rewrite wedge_pointE.
1867-
- rewrite /wedge_prod_fun /= ?wedge_funl //= ?wedge_funr //.
1868-
by move=> R; have [<- ->] := EqdepFacts.eq_sig_fst R; rewrite wedge_pointE.
1869-
- rewrite /wedge_prod_fun /= ?wedge_funr //=.
1870-
by move=> R; have [ ->] := EqdepFacts.eq_sig_fst R.
1871-
case=> /= [][x y] xyE _; have /set_mem [[_ ]|[ + _]] /= := xyE.
1872-
move=> yE; exists (wedgel x) => //; rewrite /wedge_prod_fun wedge_funl /=.
1873-
by apply: eq_exist; rewrite yE.
1874-
exact: eq_exist.
1875-
move=> xE; exists (wedger y) => //; rewrite /wedge_prod_fun wedge_funr /=.
1876-
by apply: eq_exist; rewrite xE.
1877-
exact: eq_exist.
1820+
Lemma wedge_compact : finite_set [set: I] -> (forall i, compact [set: X i]) ->
1821+
compact [set: wedge].
1822+
Proof.
1823+
move=> fsetI cptX.
1824+
rewrite -wedgeTE -fsbig_setU //; apply: big_ind.
1825+
- exact: compact0.
1826+
- by move=> ? ? ? ?; exact: compactU.
1827+
move=> i _; apply: continuous_compact; last exact: cptX.
1828+
by apply: continuous_subspaceT; exact: wedgei_continuous.
18781829
Qed.
18791830

1880-
Lemma wedge_prod_continuous : continuous wedge_prod_fun.
1831+
(* The wedge maps into the product
1832+
\bigcup_i [x | x j = p0 j when j != i]
1833+
1834+
For the box topology, it's an embedding. But more practically,
1835+
since the box and product agree when `I` is finite,
1836+
we get that the finite wedge embeds into the finite product.
1837+
*)
1838+
Section wedge_as_product.
1839+
Definition wedge_prod_fun : wedge -> prod_topology X :=
1840+
wedge_fun (fun i x => dfwith (p0) i x).
1841+
1842+
Lemma wedge_prod_fun_pointE (i j : I) : dfwith p0 i (p0 i) = dfwith p0 j (p0 j).
18811843
Proof.
1882-
apply: wedge_continuous; last by exact: eq_exist.
1883-
apply/continuousP => ? [A oA <-]; rewrite -comp_preimage.
1884-
apply: open_comp => //; set f := (set_val \o _).
1885-
have -> : (f = fun x => (x,y0)) by exact/funext.
1886-
move=> ? ?; apply: continuous2_cvg => //; last exact: cvg_cst.
1887-
by have -> : (fun z => (z.1,z.2)) = (@id (X*Y)) by apply/funext; case.
1888-
apply/continuousP => ? [A oA <-]; rewrite -comp_preimage.
1889-
apply: open_comp => //; set f := (set_val \o _).
1890-
have -> : (f = fun y => (x0,y)) by exact/funext.
1891-
move=> ? ?; apply: continuous2_cvg => //; last exact: cvg_cst.
1892-
by have -> : (fun z => (z.1,z.2)) = (@id (X*Y)) by apply/funext; case.
1893-
Qed.
1894-
1895-
Lemma wedge_prod_open (z : wedge) (A : set wedge) :
1896-
closed [set x0] -> closed [set y0] ->
1897-
nbhs z A -> nbhs (wedge_prod_fun z) (wedge_prod_fun @` A).
1898-
Proof.
1899-
move=> clx cly; case: wedge_nbhs_specP => //.
1900-
- move=> x ? /=; rewrite nbhsE; case => B [? ? BA].
1901-
exists ((fun x => @exist _ _ (x,y0) (wedge_prodl x)) @` (B `&` ~`[set x0])).
1902-
split=> /=; first last.
1903-
+ move=> ? /= [a] [? ?] <-; exists (wedgel a); first exact: BA.
1904-
by rewrite /wedge_prod_fun wedge_funl //; apply: eq_exist.
1905-
+ exists x; first by split => //; exact/eqP.
1906-
by rewrite // /wedge_prod_fun wedge_funl; apply:eq_exist.
1907-
exists ((B `&` ~`[set x0]) `*` setT).
1908-
by apply: openX; [apply: openI => //; exact: closed_openC | exact: openT].
1909-
rewrite eqEsubset; split; case; case=> a b /= p [].
1910-
case=> Ba ax0 _; exists a => //; apply: eq_exist; congr((_,_)).
1911-
by move:ax0; have /set_mem [[_ <- //] | [] <-] /= := p.
1912-
by move=> l [Bl lNx0] [<-].
1913-
- move=> y ? /=; rewrite nbhsE; case => B [? ? BA].
1914-
exists ((fun y => @exist _ _ (x0,y) (wedge_prodr y)) @` (B `&` ~`[set y0])).
1915-
split=> /=; first last.
1916-
+ move=> ? /= [b] [? ?] <-; exists (wedger b); first exact: BA.
1917-
by rewrite /wedge_prod_fun wedge_funr //; apply: eq_exist.
1918-
+ exists y; first by split => //; exact/eqP.
1919-
by rewrite // /wedge_prod_fun wedge_funr; apply:eq_exist.
1920-
exists (setT `*` (B `&` ~`[set y0])).
1921-
by apply: openX; [exact: openT | apply: openI => //; exact: closed_openC].
1922-
rewrite eqEsubset; split; case; case=> a b /= p [].
1923-
move=> _ [Bb by0]; exists b => //; apply: eq_exist; congr((_,_)).
1924-
by move:by0; have /set_mem [[_ <- //] | [] <-] /= := p.
1925-
by move=> ? [? ?] [_ <-].
1926-
case; rewrite /= ?nbhsE;case=> L [oL Lx LA] [R [oR Ry RA]].
1927-
exists ( ((fun x => @exist _ _ (x,y0) (wedge_prodl x)) @` L) `|`
1928-
(fun y => @exist _ _ (x0,y) (wedge_prodr y)) @` R); first last.
1929-
case; case=> l r/= p [] /= []? ? [] E1 E2.
1930-
exists (wedgel l); first by apply: LA; rewrite -E1.
1931-
by rewrite /wedge_prod_fun wedge_funl; apply: eq_exist; rewrite E2.
1932-
exists (wedger r); first by apply: RA; rewrite -E2.
1933-
by rewrite /wedge_prod_fun wedge_funr; apply: eq_exist; rewrite E1.
1934-
split; first last.
1935-
by left; exists x0 => //; rewrite /wedge_prod_fun wedge_funl; apply:eq_exist.
1936-
exists (L`*` R); first exact: openX.
1937-
rewrite eqEsubset; split; case; case=> l r /= p [].
1938-
- move=> Ll Rr; have /set_mem [[_] | [+ _]] /= := p.
1939-
by move=> E; left; exists l => //; apply: eq_exist; rewrite E.
1940-
by move=> E; right; exists r => //; apply: eq_exist; rewrite E.
1941-
- by case=> ? ? [<-] <-; split => //.
1942-
- by case=> ? ? [<-] <-; split => //.
1844+
apply: functional_extensionality_dep => k /=.
1845+
case: dfwithP; first case: dfwithP => //.
1846+
by move=> i1 iNi1; case: dfwithP => //.
19431847
Qed.
19441848

1945-
Lemma wedge_hausdorff :
1946-
hausdorff_space X ->
1947-
hausdorff_space Y ->
1948-
hausdorff_space wedge.
1849+
Lemma wedge_prod_fun_inj : injective wedge_prod_fun.
19491850
Proof.
1950-
move=> hX hY a b clab; have [g gK prodK] := wedge_prod_fun_bij.
1951-
rewrite -[a]gK -[b]gK; congr(g _).
1952-
have := @weak_hausdorff wedge_prod; apply => //.
1953-
exact: hausdorff_prod.
1954-
move=> U V /wedge_prod_continuous Uwa /wedge_prod_continuous Vwb.
1955-
by have [z [/=] ? ?] := clab _ _ (Uwa) (Vwb); exists (wedge_prod_fun z).
1851+
have ? := wedge_prod_fun_pointE.
1852+
move=> a b; rewrite -[a](@reprK _ wedge) -[b](@reprK _ wedge).
1853+
case Ea : (repr a)=> [i x]; case Eb : (repr b) => [j y].
1854+
rewrite /wedge_prod_fun /= ?wedge_fun_wedgei //.
1855+
move=> dfij; apply/eqmodP/orP.
1856+
case: (pselect (i = j)) => E.
1857+
destruct E; left; apply/eqP; congr(_ _).
1858+
have : dfwith p0 i x i = dfwith p0 i y i by rewrite dfij.
1859+
by rewrite ?dfwithin.
1860+
right => /=; apply/andP; split; apply/eqP.
1861+
have : dfwith p0 i x i = dfwith p0 j y i by rewrite dfij.
1862+
by rewrite dfwithin => ->; rewrite dfwithout // eq_sym; apply/eqP.
1863+
have : dfwith p0 i x j = dfwith p0 j y j by rewrite dfij.
1864+
by rewrite dfwithin => <-; rewrite dfwithout //; apply/eqP.
19561865
Qed.
19571866

1958-
Lemma wedge_comp {Z1 Z2 : topologicalType} (f : Z1 -> Z2) g h :
1959-
g x0 = h y0 -> f \o wedge_fun g h = wedge_fun (f \o g) (f \o h).
1867+
Lemma wedge_prod_continuous : continuous wedge_prod_fun.
19601868
Proof.
1961-
move=> ghE; apply/funext => z /=; rewrite -[z]reprK /=.
1962-
by case E: (repr z); rewrite ?wedge_funl ?wedge_funr //= ghE.
1963-
Qed.
1869+
apply: wedge_fun_continuous; last exact: wedge_prod_fun_pointE.
1870+
exact: dfwith_continuous.
1871+
Qed.
1872+
1873+
Lemma wedge_prod_open (x : wedge) (A : set wedge) :
1874+
finite_set [set: I] ->
1875+
(forall i, closed [set p0 i]) ->
1876+
nbhs x A ->
1877+
@nbhs _ (subspace (range wedge_prod_fun)) (wedge_prod_fun x) (wedge_prod_fun @` A).
1878+
Proof.
1879+
move=> fsetI clI; case: wedge_nbhs_specP => //.
1880+
move=> i0 bcA.
1881+
pose B_ i : set ((subspace (range wedge_prod_fun))) := proj i @^-1` (@wedgei i@^-1` A).
1882+
have /finite_fsetP [fI fIE] := fsetI.
1883+
have : (\bigcap_(i in [set` fI]) B_ i) `&` range wedge_prod_fun `<=` wedge_prod_fun @` A.
1884+
move=> ? [] /[swap] [][] z _ <- /= Bwz; exists z => //.
1885+
have Iz : [set` fI] (projT1 (repr z)) by rewrite -fIE //.
1886+
have := Bwz _ Iz; congr(A _); rewrite /wedgei /= -[RHS]reprK.
1887+
apply/eqmodP/orP; left; rewrite /proj /=.
1888+
by rewrite /wedge_prod_fun /= /wedge_fun /sum_fun /= dfwithin -sigT_eta.
1889+
move/filterS; apply.
1890+
apply/nbhs_subspace_ex; first by exists (wedgei (p0 i0)).
1891+
exists (\bigcap_(i in [set` fI]) B_ i); last by rewrite -setIA setIid.
1892+
apply: filter_bigI => i _.
1893+
rewrite /B_; apply: proj_continuous.
1894+
(have Ii : [set: I] i by done); have /= := bcA _ Ii; congr(nbhs _ _).
1895+
rewrite /proj /wedge_prod_fun.
1896+
rewrite wedge_fun_wedgei; last exact: wedge_prod_fun_pointE.
1897+
by case: dfwithP.
1898+
move=> i z zNp0 /= wNz.
1899+
rewrite [x in nbhs x _]/wedge_prod_fun /= wedge_fun_wedgei; first last.
1900+
exact: wedge_prod_fun_pointE.
1901+
have : wedge_prod_fun @` (A `&` (@wedgei i @` ~`[set p0 i])) `<=` wedge_prod_fun @` A.
1902+
by move=> ? [] ? [] + /= [w] wpi => /[swap] <- Aw <-; exists (wedgei w).
1903+
move/filterS; apply; apply/nbhs_subspace_ex.
1904+
exists (wedgei z) => //.
1905+
by rewrite /wedge_prod_fun wedge_fun_wedgei //; exact: wedge_prod_fun_pointE.
1906+
exists (proj i @^-1` (@wedgei i @^-1` (A `&` (@wedgei i @` ~`[set p0 i])))).
1907+
apply/ proj_continuous; rewrite /proj dfwithin preimage_setI; apply: filterI.
1908+
exact: wNz.
1909+
have /filterS := @preimage_image _ _ (@wedgei i) (~` [set p0 i]).
1910+
apply; apply: open_nbhs_nbhs; split; first exact: closed_openC.
1911+
by apply/eqP.
1912+
rewrite eqEsubset; split => // ?; case => /[swap] [][] r _ <- /=.
1913+
case => ? /[swap] /wedge_prod_fun_inj -> [+ [e /[swap]]] => /[swap].
1914+
move=> <- Awe eNpi; rewrite /proj /wedge_prod_fun /=.
1915+
rewrite ?wedge_fun_wedgei; last exact: wedge_prod_fun_pointE.
1916+
rewrite dfwithin; split => //; first by (split => //; exists e).
1917+
exists (wedgei e) => //.
1918+
by rewrite wedge_fun_wedgei //; exact: wedge_prod_fun_pointE.
1919+
case=> /[swap] [][y] yNpi E Ay.
1920+
case : (pselect (i = (projT1 (repr r)))); first last.
1921+
move=> R; move: yNpi; apply: absurd.
1922+
move: E; rewrite /proj/wedge_prod_fun /wedge_fun /=/sum_fun /=.
1923+
rewrite dfwithout //; last by rewrite eq_sym; apply/eqP.
1924+
case/eqmodP/orP; last by case/andP => /= /eqP E.
1925+
move=> /eqP => E.
1926+
have := Eqdep_dec.inj_pair2_eq_dec _ _ _ _ _ _ E; apply.
1927+
by move=> a b; case: (pselect (a = b)) => ?; [left | right].
1928+
move=> riE; split; exists (wedgei y) => //.
1929+
- by split; [rewrite E | exists y].
1930+
- congr (wedge_prod_fun _); rewrite E.
1931+
rewrite /proj /wedge_prod_fun /wedge_fun /=/sum_fun.
1932+
by rewrite riE dfwithin /wedgei /= -sigT_eta reprK.
1933+
- congr(wedge_prod_fun _); rewrite E .
1934+
rewrite /proj /wedge_prod_fun /wedge_fun /=/sum_fun.
1935+
by rewrite riE dfwithin /wedgei /= -sigT_eta reprK.
1936+
Qed.
1937+
End wedge_as_product.
19641938

1939+
Lemma wedge_hausdorff :
1940+
(forall i, hausdorff_space (X i)) ->
1941+
hausdorff_space wedge.
1942+
Proof.
1943+
move=> /hausdorff_product hf => x y clxy.
1944+
apply: wedge_prod_fun_inj; apply: hf => U V /wedge_prod_continuous.
1945+
move=> nU /wedge_prod_continuous nV; have := clxy _ _ nU nV.
1946+
by case => z [/=] ? ?; exists (wedge_prod_fun z).
1947+
Qed.
19651948
End wedge.
19661949

19671950
HB.mixin Record isBiPointed (X : Type) of Equality X := {
@@ -1972,36 +1955,40 @@ HB.mixin Record isBiPointed (X : Type) of Equality X := {
19721955

19731956
#[short(type="biPointedType")]
19741957
HB.structure Definition BiPointed :=
1975-
{ X of Equality X & isBiPointed X }.
1958+
{ X of Choice X & isBiPointed X }.
19761959

19771960
#[short(type="bpTopologicalType")]
19781961
HB.structure Definition BiPointedTopological :=
19791962
{ X of BiPointed X & Topological X }.
19801963

1981-
Notation bpwedge X Y := (@wedge X Y one zero).
1982-
Notation bpwedgel := (@wedgel _ _ one zero).
1983-
Notation bpwedger := (@wedger _ _ one zero).
19841964
Section bpwedge.
1985-
Context {X Y : bpTopologicalType}.
1986-
1987-
Local Lemma wedge_neq : bpwedgel zero != bpwedger one :> bpwedge X Y.
1965+
Context (X Y : bpTopologicalType).
1966+
Definition wedge2 b := if b then X else Y.
1967+
Definition wedge2p b := if b return wedge2 b then (@one X) else (@zero Y).
1968+
Local Notation bpwedge := (@wedge bool wedge2 wedge2p).
1969+
Local Notation bpwedgei := (@wedgei bool wedge2 wedge2p).
1970+
1971+
Local Lemma wedge_neq : @bpwedgei true zero != @bpwedgei false one .
19881972
Proof.
1989-
apply/eqP => R; have /eqmodP/orP[/eqP //|/orP [] /andP [//]] := R.
1990-
by case/eqP => /eqP + _; apply/negP; apply: zero_one_neq.
1973+
apply/eqP => R; have /eqmodP/orP[/eqP //|/andP[ /= + _]] := R.
1974+
by have := (@zero_one_neq X) => /[swap] ->.
19911975
Qed.
19921976

19931977
HB.instance Definition _ := @isBiPointed.Build
1994-
(bpwedge X Y) (bpwedgel zero) (bpwedger one) wedge_neq.
1978+
bpwedge (@bpwedgei true zero) (@bpwedgei false one) wedge_neq.
19951979
End bpwedge.
19961980

1981+
Notation bpwedge X Y := (@wedge bool (wedge2 X Y) (wedge2p X Y)).
1982+
Notation bpwedgei X Y := (@wedgei bool (wedge2 X Y) (wedge2p X Y)).
1983+
19971984
(* Such a structure is very much like [a,b] in that
19981985
one can split it in half like `[0,1] \/ [0,1] ~ [0,2] ~ [0,1]
19991986
*)
20001987
HB.mixin Record isSelfSplit (X : Type) of BiPointedTopological X := {
2001-
to_wedge : X -> @wedge X X one zero;
2002-
from_wedge : @wedge X X one zero -> X;
2003-
to_wedge_zero : to_wedge zero = @wedgel X X one zero zero;
2004-
to_wedge_one : to_wedge one = @wedger X X one zero one;
1988+
to_wedge : X -> bpwedge X X;
1989+
from_wedge : bpwedge X X -> X;
1990+
to_wedge_zero : to_wedge zero = zero;
1991+
to_wedge_one : to_wedge one = one;
20051992
to_wedgeK : cancel to_wedge from_wedge;
20061993
from_wedgeK : cancel from_wedge to_wedge;
20071994
to_wedge_cts : continuous to_wedge;
@@ -2069,8 +2056,10 @@ Section wedge_path.
20692056
Context {T : topologicalType} {i : selfSplitType} (x y z: T).
20702057
Context {p : {path i from x to y}} {q : {path i from y to z}}.
20712058

2072-
Definition path_concat {T : topologicalType} (f g : i -> T) :=
2073-
wedge_fun f g \o to_wedge.
2059+
Check @wedge_fun.
2060+
Definition path_concat (f g : i -> T) : i -> T :=
2061+
wedge_fun (fun b => if b return wedge2 i i b -> T then f else g) \o to_wedge.
2062+
20742063

20752064
Notation "f '<>' g" := (path_concat f g).
20762065

0 commit comments

Comments
 (0)