@@ -1700,6 +1700,7 @@ Definition wedge := {eq_quot wedge_rel}.
17001700Definition wedgei (i : I) : X i -> wedge := \pi_wedge \o (existT X i).
17011701
17021702HB.instance Definition _ := Topological.copy wedge (quotient_topology wedge).
1703+ HB.instance Definition _ := Quotient.on wedge.
17031704Global Opaque wedge.
17041705
17051706Lemma 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.
17891790by move/eqP => xpi; rewrite /= -wedgei_nbhs //; apply: WedgeNotPoint.
17901791Qed .
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+
18011793Definition 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 +].
18111803by rewrite /sum_fun /= => -> ->; exact: fE.
18121804Qed .
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-
18261806Lemma 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.
18281808Proof .
@@ -1837,131 +1817,134 @@ rewrite -subTset=> z _; rewrite -[z]reprK; exists (projT1 (repr z)) => //.
18371817by exists (projT2 (repr z)); rewrite // reprK /wedgei /= -sigT_eta reprK.
18381818Qed .
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.
18781829Qed .
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).
18811843Proof .
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 => //.
19431847Qed .
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.
19491850Proof .
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.
19561865Qed .
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.
19601868Proof .
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 .
19651948End wedge.
19661949
19671950HB.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")]
19741957HB.structure Definition BiPointed :=
1975- { X of Equality X & isBiPointed X }.
1958+ { X of Choice X & isBiPointed X }.
19761959
19771960#[short(type="bpTopologicalType")]
19781961HB.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).
19841964Section 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 .
19881972Proof .
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] -> .
19911975Qed .
19921976
19931977HB.instance Definition _ := @isBiPointed.Build
1994- ( bpwedge X Y) (bpwedgel zero) (bpwedger one) wedge_neq.
1978+ bpwedge (@bpwedgei true zero) (@bpwedgei false one) wedge_neq.
19951979End 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 *)
20001987HB.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.
20692056Context {T : topologicalType} {i : selfSplitType} (x y z: T).
20702057Context {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
20752064Notation "f '<>' g" := (path_concat f g).
20762065
0 commit comments