MPE Home Metamath Proof Explorer < Previous   Next >
Nearby theorems
Mirrors  >  Home  >  MPE Home  >  Th. List  >  metsscmetcld Structured version   Visualization version   GIF version

Theorem metsscmetcld 24679
Description: A complete subspace of a metric space is closed in the parent space. Formerly part of proof for cmetss 24680. (Contributed by NM, 28-Jan-2008.) (Revised by Mario Carneiro, 15-Oct-2015.) (Revised by AV, 9-Oct-2022.)
Hypothesis
Ref Expression
metsscmetcld.j 𝐽 = (MetOpen‘𝐷)
Assertion
Ref Expression
metsscmetcld ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → 𝑌 ∈ (Clsd‘𝐽))

Proof of Theorem metsscmetcld
Dummy variables 𝑥 𝑓 are mutually distinct and distinct from all other variables.
StepHypRef Expression
1 metxmet 23687 . . . . . . 7 (𝐷 ∈ (Met‘𝑋) → 𝐷 ∈ (∞Met‘𝑋))
21adantr 481 . . . . . 6 ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → 𝐷 ∈ (∞Met‘𝑋))
3 metsscmetcld.j . . . . . . 7 𝐽 = (MetOpen‘𝐷)
43mopntopon 23792 . . . . . 6 (𝐷 ∈ (∞Met‘𝑋) → 𝐽 ∈ (TopOn‘𝑋))
52, 4syl 17 . . . . 5 ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → 𝐽 ∈ (TopOn‘𝑋))
6 resss 5962 . . . . . . 7 (𝐷 ↾ (𝑌 × 𝑌)) ⊆ 𝐷
7 dmss 5858 . . . . . . 7 ((𝐷 ↾ (𝑌 × 𝑌)) ⊆ 𝐷 → dom (𝐷 ↾ (𝑌 × 𝑌)) ⊆ dom 𝐷)
8 dmss 5858 . . . . . . 7 (dom (𝐷 ↾ (𝑌 × 𝑌)) ⊆ dom 𝐷 → dom dom (𝐷 ↾ (𝑌 × 𝑌)) ⊆ dom dom 𝐷)
96, 7, 8mp2b 10 . . . . . 6 dom dom (𝐷 ↾ (𝑌 × 𝑌)) ⊆ dom dom 𝐷
10 cmetmet 24650 . . . . . . . 8 ((𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌) → (𝐷 ↾ (𝑌 × 𝑌)) ∈ (Met‘𝑌))
11 metdmdm 23689 . . . . . . . 8 ((𝐷 ↾ (𝑌 × 𝑌)) ∈ (Met‘𝑌) → 𝑌 = dom dom (𝐷 ↾ (𝑌 × 𝑌)))
1210, 11syl 17 . . . . . . 7 ((𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌) → 𝑌 = dom dom (𝐷 ↾ (𝑌 × 𝑌)))
13 metdmdm 23689 . . . . . . 7 (𝐷 ∈ (Met‘𝑋) → 𝑋 = dom dom 𝐷)
14 sseq12 3971 . . . . . . 7 ((𝑌 = dom dom (𝐷 ↾ (𝑌 × 𝑌)) ∧ 𝑋 = dom dom 𝐷) → (𝑌𝑋 ↔ dom dom (𝐷 ↾ (𝑌 × 𝑌)) ⊆ dom dom 𝐷))
1512, 13, 14syl2anr 597 . . . . . 6 ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → (𝑌𝑋 ↔ dom dom (𝐷 ↾ (𝑌 × 𝑌)) ⊆ dom dom 𝐷))
169, 15mpbiri 257 . . . . 5 ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → 𝑌𝑋)
17 flimcls 23336 . . . . 5 ((𝐽 ∈ (TopOn‘𝑋) ∧ 𝑌𝑋) → (𝑥 ∈ ((cls‘𝐽)‘𝑌) ↔ ∃𝑓 ∈ (Fil‘𝑋)(𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓))))
185, 16, 17syl2anc 584 . . . 4 ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → (𝑥 ∈ ((cls‘𝐽)‘𝑌) ↔ ∃𝑓 ∈ (Fil‘𝑋)(𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓))))
19 simprrr 780 . . . . . 6 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → 𝑥 ∈ (𝐽 fLim 𝑓))
202adantr 481 . . . . . . . 8 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → 𝐷 ∈ (∞Met‘𝑋))
213methaus 23876 . . . . . . . 8 (𝐷 ∈ (∞Met‘𝑋) → 𝐽 ∈ Haus)
22 hausflimi 23331 . . . . . . . 8 (𝐽 ∈ Haus → ∃*𝑥 𝑥 ∈ (𝐽 fLim 𝑓))
2320, 21, 223syl 18 . . . . . . 7 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → ∃*𝑥 𝑥 ∈ (𝐽 fLim 𝑓))
2420, 4syl 17 . . . . . . . . . . 11 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → 𝐽 ∈ (TopOn‘𝑋))
25 simprl 769 . . . . . . . . . . 11 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → 𝑓 ∈ (Fil‘𝑋))
26 simprrl 779 . . . . . . . . . . 11 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → 𝑌𝑓)
27 flimrest 23334 . . . . . . . . . . 11 ((𝐽 ∈ (TopOn‘𝑋) ∧ 𝑓 ∈ (Fil‘𝑋) ∧ 𝑌𝑓) → ((𝐽t 𝑌) fLim (𝑓t 𝑌)) = ((𝐽 fLim 𝑓) ∩ 𝑌))
2824, 25, 26, 27syl3anc 1371 . . . . . . . . . 10 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → ((𝐽t 𝑌) fLim (𝑓t 𝑌)) = ((𝐽 fLim 𝑓) ∩ 𝑌))
2916adantr 481 . . . . . . . . . . . 12 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → 𝑌𝑋)
30 eqid 2736 . . . . . . . . . . . . 13 (𝐷 ↾ (𝑌 × 𝑌)) = (𝐷 ↾ (𝑌 × 𝑌))
31 eqid 2736 . . . . . . . . . . . . 13 (MetOpen‘(𝐷 ↾ (𝑌 × 𝑌))) = (MetOpen‘(𝐷 ↾ (𝑌 × 𝑌)))
3230, 3, 31metrest 23880 . . . . . . . . . . . 12 ((𝐷 ∈ (∞Met‘𝑋) ∧ 𝑌𝑋) → (𝐽t 𝑌) = (MetOpen‘(𝐷 ↾ (𝑌 × 𝑌))))
3320, 29, 32syl2anc 584 . . . . . . . . . . 11 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → (𝐽t 𝑌) = (MetOpen‘(𝐷 ↾ (𝑌 × 𝑌))))
3433oveq1d 7372 . . . . . . . . . 10 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → ((𝐽t 𝑌) fLim (𝑓t 𝑌)) = ((MetOpen‘(𝐷 ↾ (𝑌 × 𝑌))) fLim (𝑓t 𝑌)))
3528, 34eqtr3d 2778 . . . . . . . . 9 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → ((𝐽 fLim 𝑓) ∩ 𝑌) = ((MetOpen‘(𝐷 ↾ (𝑌 × 𝑌))) fLim (𝑓t 𝑌)))
36 simplr 767 . . . . . . . . . 10 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌))
373flimcfil 24678 . . . . . . . . . . . 12 ((𝐷 ∈ (∞Met‘𝑋) ∧ 𝑥 ∈ (𝐽 fLim 𝑓)) → 𝑓 ∈ (CauFil‘𝐷))
3820, 19, 37syl2anc 584 . . . . . . . . . . 11 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → 𝑓 ∈ (CauFil‘𝐷))
39 cfilres 24660 . . . . . . . . . . . 12 ((𝐷 ∈ (∞Met‘𝑋) ∧ 𝑓 ∈ (Fil‘𝑋) ∧ 𝑌𝑓) → (𝑓 ∈ (CauFil‘𝐷) ↔ (𝑓t 𝑌) ∈ (CauFil‘(𝐷 ↾ (𝑌 × 𝑌)))))
4020, 25, 26, 39syl3anc 1371 . . . . . . . . . . 11 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → (𝑓 ∈ (CauFil‘𝐷) ↔ (𝑓t 𝑌) ∈ (CauFil‘(𝐷 ↾ (𝑌 × 𝑌)))))
4138, 40mpbid 231 . . . . . . . . . 10 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → (𝑓t 𝑌) ∈ (CauFil‘(𝐷 ↾ (𝑌 × 𝑌))))
4231cmetcvg 24649 . . . . . . . . . 10 (((𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌) ∧ (𝑓t 𝑌) ∈ (CauFil‘(𝐷 ↾ (𝑌 × 𝑌)))) → ((MetOpen‘(𝐷 ↾ (𝑌 × 𝑌))) fLim (𝑓t 𝑌)) ≠ ∅)
4336, 41, 42syl2anc 584 . . . . . . . . 9 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → ((MetOpen‘(𝐷 ↾ (𝑌 × 𝑌))) fLim (𝑓t 𝑌)) ≠ ∅)
4435, 43eqnetrd 3011 . . . . . . . 8 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → ((𝐽 fLim 𝑓) ∩ 𝑌) ≠ ∅)
45 ndisj 4327 . . . . . . . 8 (((𝐽 fLim 𝑓) ∩ 𝑌) ≠ ∅ ↔ ∃𝑥(𝑥 ∈ (𝐽 fLim 𝑓) ∧ 𝑥𝑌))
4644, 45sylib 217 . . . . . . 7 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → ∃𝑥(𝑥 ∈ (𝐽 fLim 𝑓) ∧ 𝑥𝑌))
47 mopick 2625 . . . . . . 7 ((∃*𝑥 𝑥 ∈ (𝐽 fLim 𝑓) ∧ ∃𝑥(𝑥 ∈ (𝐽 fLim 𝑓) ∧ 𝑥𝑌)) → (𝑥 ∈ (𝐽 fLim 𝑓) → 𝑥𝑌))
4823, 46, 47syl2anc 584 . . . . . 6 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → (𝑥 ∈ (𝐽 fLim 𝑓) → 𝑥𝑌))
4919, 48mpd 15 . . . . 5 (((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) ∧ (𝑓 ∈ (Fil‘𝑋) ∧ (𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)))) → 𝑥𝑌)
5049rexlimdvaa 3153 . . . 4 ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → (∃𝑓 ∈ (Fil‘𝑋)(𝑌𝑓𝑥 ∈ (𝐽 fLim 𝑓)) → 𝑥𝑌))
5118, 50sylbid 239 . . 3 ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → (𝑥 ∈ ((cls‘𝐽)‘𝑌) → 𝑥𝑌))
5251ssrdv 3950 . 2 ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → ((cls‘𝐽)‘𝑌) ⊆ 𝑌)
533mopntop 23793 . . . 4 (𝐷 ∈ (∞Met‘𝑋) → 𝐽 ∈ Top)
542, 53syl 17 . . 3 ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → 𝐽 ∈ Top)
553mopnuni 23794 . . . . 5 (𝐷 ∈ (∞Met‘𝑋) → 𝑋 = 𝐽)
562, 55syl 17 . . . 4 ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → 𝑋 = 𝐽)
5716, 56sseqtrd 3984 . . 3 ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → 𝑌 𝐽)
58 eqid 2736 . . . 4 𝐽 = 𝐽
5958iscld4 22416 . . 3 ((𝐽 ∈ Top ∧ 𝑌 𝐽) → (𝑌 ∈ (Clsd‘𝐽) ↔ ((cls‘𝐽)‘𝑌) ⊆ 𝑌))
6054, 57, 59syl2anc 584 . 2 ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → (𝑌 ∈ (Clsd‘𝐽) ↔ ((cls‘𝐽)‘𝑌) ⊆ 𝑌))
6152, 60mpbird 256 1 ((𝐷 ∈ (Met‘𝑋) ∧ (𝐷 ↾ (𝑌 × 𝑌)) ∈ (CMet‘𝑌)) → 𝑌 ∈ (Clsd‘𝐽))
Colors of variables: wff setvar class
Syntax hints:  wi 4  wb 205  wa 396   = wceq 1541  wex 1781  wcel 2106  ∃*wmo 2536  wne 2943  wrex 3073  cin 3909  wss 3910  c0 4282   cuni 4865   × cxp 5631  dom cdm 5633  cres 5635  cfv 6496  (class class class)co 7357  t crest 17302  ∞Metcxmet 20781  Metcmet 20782  MetOpencmopn 20786  Topctop 22242  TopOnctopon 22259  Clsdccld 22367  clsccl 22369  Hauscha 22659  Filcfil 23196   fLim cflim 23285  CauFilccfil 24616  CMetccmet 24618
This theorem was proved from axioms:  ax-mp 5  ax-1 6  ax-2 7  ax-3 8  ax-gen 1797  ax-4 1811  ax-5 1913  ax-6 1971  ax-7 2011  ax-8 2108  ax-9 2116  ax-10 2137  ax-11 2154  ax-12 2171  ax-ext 2707  ax-rep 5242  ax-sep 5256  ax-nul 5263  ax-pow 5320  ax-pr 5384  ax-un 7672  ax-cnex 11107  ax-resscn 11108  ax-1cn 11109  ax-icn 11110  ax-addcl 11111  ax-addrcl 11112  ax-mulcl 11113  ax-mulrcl 11114  ax-mulcom 11115  ax-addass 11116  ax-mulass 11117  ax-distr 11118  ax-i2m1 11119  ax-1ne0 11120  ax-1rid 11121  ax-rnegex 11122  ax-rrecex 11123  ax-cnre 11124  ax-pre-lttri 11125  ax-pre-lttrn 11126  ax-pre-ltadd 11127  ax-pre-mulgt0 11128  ax-pre-sup 11129
This theorem depends on definitions:  df-bi 206  df-an 397  df-or 846  df-3or 1088  df-3an 1089  df-tru 1544  df-fal 1554  df-ex 1782  df-nf 1786  df-sb 2068  df-mo 2538  df-eu 2567  df-clab 2714  df-cleq 2728  df-clel 2814  df-nfc 2889  df-ne 2944  df-nel 3050  df-ral 3065  df-rex 3074  df-rmo 3353  df-reu 3354  df-rab 3408  df-v 3447  df-sbc 3740  df-csb 3856  df-dif 3913  df-un 3915  df-in 3917  df-ss 3927  df-pss 3929  df-nul 4283  df-if 4487  df-pw 4562  df-sn 4587  df-pr 4589  df-op 4593  df-uni 4866  df-int 4908  df-iun 4956  df-iin 4957  df-br 5106  df-opab 5168  df-mpt 5189  df-tr 5223  df-id 5531  df-eprel 5537  df-po 5545  df-so 5546  df-fr 5588  df-we 5590  df-xp 5639  df-rel 5640  df-cnv 5641  df-co 5642  df-dm 5643  df-rn 5644  df-res 5645  df-ima 5646  df-pred 6253  df-ord 6320  df-on 6321  df-lim 6322  df-suc 6323  df-iota 6448  df-fun 6498  df-fn 6499  df-f 6500  df-f1 6501  df-fo 6502  df-f1o 6503  df-fv 6504  df-riota 7313  df-ov 7360  df-oprab 7361  df-mpo 7362  df-om 7803  df-1st 7921  df-2nd 7922  df-frecs 8212  df-wrecs 8243  df-recs 8317  df-rdg 8356  df-1o 8412  df-er 8648  df-map 8767  df-en 8884  df-dom 8885  df-sdom 8886  df-fin 8887  df-fi 9347  df-sup 9378  df-inf 9379  df-pnf 11191  df-mnf 11192  df-xr 11193  df-ltxr 11194  df-le 11195  df-sub 11387  df-neg 11388  df-div 11813  df-nn 12154  df-2 12216  df-n0 12414  df-z 12500  df-uz 12764  df-q 12874  df-rp 12916  df-xneg 13033  df-xadd 13034  df-xmul 13035  df-ico 13270  df-icc 13271  df-rest 17304  df-topgen 17325  df-psmet 20788  df-xmet 20789  df-met 20790  df-bl 20791  df-mopn 20792  df-fbas 20793  df-fg 20794  df-top 22243  df-topon 22260  df-bases 22296  df-cld 22370  df-ntr 22371  df-cls 22372  df-nei 22449  df-haus 22666  df-fil 23197  df-flim 23290  df-cfil 24619  df-cmet 24621
This theorem is referenced by:  cmetss  24680  cmssmscld  24714
  Copyright terms: Public domain W3C validator