ILE Home Intuitionistic Logic Explorer < Previous   Next >
Nearby theorems
Mirrors  >  Home  >  ILE Home  >  Th. List  >  fsum3cvg3 Unicode version

Theorem fsum3cvg3 11436
Description: A finite sum is convergent. (Contributed by Mario Carneiro, 24-Apr-2014.) (Revised by Jim Kingdon, 2-Dec-2022.)
Hypotheses
Ref Expression
fsumcvg3.1  |-  Z  =  ( ZZ>= `  M )
fsumcvg3.2  |-  ( ph  ->  M  e.  ZZ )
fsumcvg3.3  |-  ( ph  ->  A  e.  Fin )
fsumcvg3.4  |-  ( ph  ->  A  C_  Z )
fisumcvg3.dc  |-  ( (
ph  /\  k  e.  ( ZZ>= `  M )
)  -> DECID  k  e.  A
)
fsumcvg3.5  |-  ( (
ph  /\  k  e.  Z )  ->  ( F `  k )  =  if ( k  e.  A ,  B , 
0 ) )
fsumcvg3.6  |-  ( (
ph  /\  k  e.  A )  ->  B  e.  CC )
Assertion
Ref Expression
fsum3cvg3  |-  ( ph  ->  seq M (  +  ,  F )  e. 
dom 
~~>  )
Distinct variable groups:    A, k    k, F    k, M    ph, k
Allowed substitution hints:    B( k)    Z( k)

Proof of Theorem fsum3cvg3
Dummy variables  n  m  x  y  z are mutually distinct and distinct from all other variables.
StepHypRef Expression
1 fsumcvg3.4 . . . . 5  |-  ( ph  ->  A  C_  Z )
2 fsumcvg3.1 . . . . . 6  |-  Z  =  ( ZZ>= `  M )
3 uzssz 9577 . . . . . . 7  |-  ( ZZ>= `  M )  C_  ZZ
4 zssre 9290 . . . . . . 7  |-  ZZ  C_  RR
53, 4sstri 3179 . . . . . 6  |-  ( ZZ>= `  M )  C_  RR
62, 5eqsstri 3202 . . . . 5  |-  Z  C_  RR
71, 6sstrdi 3182 . . . 4  |-  ( ph  ->  A  C_  RR )
8 fsumcvg3.3 . . . 4  |-  ( ph  ->  A  e.  Fin )
9 fimaxre2 11267 . . . 4  |-  ( ( A  C_  RR  /\  A  e.  Fin )  ->  E. x  e.  RR  A. y  e.  A  y  <_  x
)
107, 8, 9syl2anc 411 . . 3  |-  ( ph  ->  E. x  e.  RR  A. y  e.  A  y  <_  x )
11 arch 9203 . . . . 5  |-  ( x  e.  RR  ->  E. m  e.  NN  x  <  m
)
1211ad2antrl 490 . . . 4  |-  ( (
ph  /\  ( x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  ->  E. m  e.  NN  x  <  m
)
13 fsumcvg3.2 . . . . . . 7  |-  ( ph  ->  M  e.  ZZ )
1413ad2antrr 488 . . . . . 6  |-  ( ( ( ph  /\  (
x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  ->  M  e.  ZZ )
15 simprl 529 . . . . . . . 8  |-  ( ( ( ph  /\  (
x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  ->  m  e.  NN )
1615nnzd 9404 . . . . . . 7  |-  ( ( ( ph  /\  (
x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  ->  m  e.  ZZ )
17 zmaxcl 11265 . . . . . . 7  |-  ( ( m  e.  ZZ  /\  M  e.  ZZ )  ->  sup ( { m ,  M } ,  RR ,  <  )  e.  ZZ )
1816, 14, 17syl2anc 411 . . . . . 6  |-  ( ( ( ph  /\  (
x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  ->  sup ( { m ,  M } ,  RR ,  <  )  e.  ZZ )
1915nnred 8962 . . . . . . 7  |-  ( ( ( ph  /\  (
x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  ->  m  e.  RR )
2014zred 9405 . . . . . . 7  |-  ( ( ( ph  /\  (
x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  ->  M  e.  RR )
21 maxle2 11253 . . . . . . 7  |-  ( ( m  e.  RR  /\  M  e.  RR )  ->  M  <_  sup ( { m ,  M } ,  RR ,  <  ) )
2219, 20, 21syl2anc 411 . . . . . 6  |-  ( ( ( ph  /\  (
x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  ->  M  <_  sup ( { m ,  M } ,  RR ,  <  ) )
23 eluz2 9564 . . . . . 6  |-  ( sup ( { m ,  M } ,  RR ,  <  )  e.  (
ZZ>= `  M )  <->  ( M  e.  ZZ  /\  sup ( { m ,  M } ,  RR ,  <  )  e.  ZZ  /\  M  <_  sup ( { m ,  M } ,  RR ,  <  ) ) )
2414, 18, 22, 23syl3anbrc 1183 . . . . 5  |-  ( ( ( ph  /\  (
x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  ->  sup ( { m ,  M } ,  RR ,  <  )  e.  (
ZZ>= `  M ) )
2514adantr 276 . . . . . . . . 9  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  M  e.  ZZ )
2618adantr 276 . . . . . . . . 9  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  sup ( { m ,  M } ,  RR ,  <  )  e.  ZZ )
271, 2sseqtrdi 3218 . . . . . . . . . . . 12  |-  ( ph  ->  A  C_  ( ZZ>= `  M ) )
2827ad3antrrr 492 . . . . . . . . . . 11  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  A  C_  ( ZZ>= `  M ) )
2928, 3sstrdi 3182 . . . . . . . . . 10  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  A  C_  ZZ )
30 simpr 110 . . . . . . . . . 10  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  z  e.  A )
3129, 30sseldd 3171 . . . . . . . . 9  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  z  e.  ZZ )
3225, 26, 313jca 1179 . . . . . . . 8  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  ( M  e.  ZZ  /\ 
sup ( { m ,  M } ,  RR ,  <  )  e.  ZZ  /\  z  e.  ZZ ) )
3327ad2antrr 488 . . . . . . . . . . 11  |-  ( ( ( ph  /\  (
x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  ->  A  C_  ( ZZ>= `  M
) )
3433sselda 3170 . . . . . . . . . 10  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  z  e.  ( ZZ>= `  M ) )
35 eluzle 9570 . . . . . . . . . 10  |-  ( z  e.  ( ZZ>= `  M
)  ->  M  <_  z )
3634, 35syl 14 . . . . . . . . 9  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  M  <_  z )
3731zred 9405 . . . . . . . . . 10  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  z  e.  RR )
3819adantr 276 . . . . . . . . . 10  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  m  e.  RR )
3926zred 9405 . . . . . . . . . 10  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  sup ( { m ,  M } ,  RR ,  <  )  e.  RR )
40 simprl 529 . . . . . . . . . . . 12  |-  ( (
ph  /\  ( x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  ->  x  e.  RR )
4140ad2antrr 488 . . . . . . . . . . 11  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  x  e.  RR )
42 breq1 4021 . . . . . . . . . . . 12  |-  ( y  =  z  ->  (
y  <_  x  <->  z  <_  x ) )
43 simprr 531 . . . . . . . . . . . . 13  |-  ( (
ph  /\  ( x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  ->  A. y  e.  A  y  <_  x )
4443ad2antrr 488 . . . . . . . . . . . 12  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  A. y  e.  A  y  <_  x )
4542, 44, 30rspcdva 2861 . . . . . . . . . . 11  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  z  <_  x )
46 simplrr 536 . . . . . . . . . . . 12  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  x  <  m )
4741, 38, 46ltled 8106 . . . . . . . . . . 11  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  x  <_  m )
4837, 41, 38, 45, 47letrd 8111 . . . . . . . . . 10  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  z  <_  m )
4920adantr 276 . . . . . . . . . . 11  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  M  e.  RR )
50 maxle1 11252 . . . . . . . . . . 11  |-  ( ( m  e.  RR  /\  M  e.  RR )  ->  m  <_  sup ( { m ,  M } ,  RR ,  <  ) )
5138, 49, 50syl2anc 411 . . . . . . . . . 10  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  m  <_  sup ( { m ,  M } ,  RR ,  <  ) )
5237, 38, 39, 48, 51letrd 8111 . . . . . . . . 9  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  z  <_  sup ( { m ,  M } ,  RR ,  <  ) )
5336, 52jca 306 . . . . . . . 8  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  ( M  <_  z  /\  z  <_  sup ( { m ,  M } ,  RR ,  <  ) ) )
54 elfz2 10045 . . . . . . . 8  |-  ( z  e.  ( M ... sup ( { m ,  M } ,  RR ,  <  ) )  <->  ( ( M  e.  ZZ  /\  sup ( { m ,  M } ,  RR ,  <  )  e.  ZZ  /\  z  e.  ZZ )  /\  ( M  <_  z  /\  z  <_  sup ( { m ,  M } ,  RR ,  <  ) ) ) )
5532, 53, 54sylanbrc 417 . . . . . . 7  |-  ( ( ( ( ph  /\  ( x  e.  RR  /\ 
A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  /\  z  e.  A )  ->  z  e.  ( M ... sup ( { m ,  M } ,  RR ,  <  )
) )
5655ex 115 . . . . . 6  |-  ( ( ( ph  /\  (
x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  -> 
( z  e.  A  ->  z  e.  ( M ... sup ( { m ,  M } ,  RR ,  <  )
) ) )
5756ssrdv 3176 . . . . 5  |-  ( ( ( ph  /\  (
x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  ->  A  C_  ( M ... sup ( { m ,  M } ,  RR ,  <  ) ) )
58 oveq2 5904 . . . . . . 7  |-  ( n  =  sup ( { m ,  M } ,  RR ,  <  )  ->  ( M ... n
)  =  ( M ... sup ( { m ,  M } ,  RR ,  <  )
) )
5958sseq2d 3200 . . . . . 6  |-  ( n  =  sup ( { m ,  M } ,  RR ,  <  )  ->  ( A  C_  ( M ... n )  <->  A  C_  ( M ... sup ( { m ,  M } ,  RR ,  <  )
) ) )
6059rspcev 2856 . . . . 5  |-  ( ( sup ( { m ,  M } ,  RR ,  <  )  e.  (
ZZ>= `  M )  /\  A  C_  ( M ... sup ( { m ,  M } ,  RR ,  <  ) ) )  ->  E. n  e.  (
ZZ>= `  M ) A 
C_  ( M ... n ) )
6124, 57, 60syl2anc 411 . . . 4  |-  ( ( ( ph  /\  (
x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  /\  ( m  e.  NN  /\  x  < 
m ) )  ->  E. n  e.  ( ZZ>=
`  M ) A 
C_  ( M ... n ) )
6212, 61rexlimddv 2612 . . 3  |-  ( (
ph  /\  ( x  e.  RR  /\  A. y  e.  A  y  <_  x ) )  ->  E. n  e.  ( ZZ>= `  M ) A  C_  ( M ... n ) )
6310, 62rexlimddv 2612 . 2  |-  ( ph  ->  E. n  e.  (
ZZ>= `  M ) A 
C_  ( M ... n ) )
642eleq2i 2256 . . . . . 6  |-  ( k  e.  Z  <->  k  e.  ( ZZ>= `  M )
)
65 fsumcvg3.5 . . . . . 6  |-  ( (
ph  /\  k  e.  Z )  ->  ( F `  k )  =  if ( k  e.  A ,  B , 
0 ) )
6664, 65sylan2br 288 . . . . 5  |-  ( (
ph  /\  k  e.  ( ZZ>= `  M )
)  ->  ( F `  k )  =  if ( k  e.  A ,  B ,  0 ) )
6766adantlr 477 . . . 4  |-  ( ( ( ph  /\  (
n  e.  ( ZZ>= `  M )  /\  A  C_  ( M ... n
) ) )  /\  k  e.  ( ZZ>= `  M ) )  -> 
( F `  k
)  =  if ( k  e.  A ,  B ,  0 ) )
68 simprl 529 . . . 4  |-  ( (
ph  /\  ( n  e.  ( ZZ>= `  M )  /\  A  C_  ( M ... n ) ) )  ->  n  e.  ( ZZ>= `  M )
)
69 fsumcvg3.6 . . . . 5  |-  ( (
ph  /\  k  e.  A )  ->  B  e.  CC )
7069adantlr 477 . . . 4  |-  ( ( ( ph  /\  (
n  e.  ( ZZ>= `  M )  /\  A  C_  ( M ... n
) ) )  /\  k  e.  A )  ->  B  e.  CC )
71 fisumcvg3.dc . . . . 5  |-  ( (
ph  /\  k  e.  ( ZZ>= `  M )
)  -> DECID  k  e.  A
)
7271adantlr 477 . . . 4  |-  ( ( ( ph  /\  (
n  e.  ( ZZ>= `  M )  /\  A  C_  ( M ... n
) ) )  /\  k  e.  ( ZZ>= `  M ) )  -> DECID  k  e.  A )
73 simprr 531 . . . 4  |-  ( (
ph  /\  ( n  e.  ( ZZ>= `  M )  /\  A  C_  ( M ... n ) ) )  ->  A  C_  ( M ... n ) )
7467, 68, 70, 72, 73fsum3cvg2 11434 . . 3  |-  ( (
ph  /\  ( n  e.  ( ZZ>= `  M )  /\  A  C_  ( M ... n ) ) )  ->  seq M (  +  ,  F )  ~~>  (  seq M (  +  ,  F ) `
 n ) )
75 climrel 11320 . . . 4  |-  Rel  ~~>
7675releldmi 4884 . . 3  |-  (  seq M (  +  ,  F )  ~~>  (  seq M (  +  ,  F ) `  n
)  ->  seq M (  +  ,  F )  e.  dom  ~~>  )
7774, 76syl 14 . 2  |-  ( (
ph  /\  ( n  e.  ( ZZ>= `  M )  /\  A  C_  ( M ... n ) ) )  ->  seq M (  +  ,  F )  e.  dom  ~~>  )
7863, 77rexlimddv 2612 1  |-  ( ph  ->  seq M (  +  ,  F )  e. 
dom 
~~>  )
Colors of variables: wff set class
Syntax hints:    -> wi 4    /\ wa 104  DECID wdc 835    /\ w3a 980    = wceq 1364    e. wcel 2160   A.wral 2468   E.wrex 2469    C_ wss 3144   ifcif 3549   {cpr 3608   class class class wbr 4018   dom cdm 4644   ` cfv 5235  (class class class)co 5896   Fincfn 6766   supcsup 7011   CCcc 7839   RRcr 7840   0cc0 7841    + caddc 7844    < clt 8022    <_ cle 8023   NNcn 8949   ZZcz 9283   ZZ>=cuz 9558   ...cfz 10038    seqcseq 10476    ~~> cli 11318
This theorem was proved from axioms:  ax-mp 5  ax-1 6  ax-2 7  ax-ia1 106  ax-ia2 107  ax-ia3 108  ax-in1 615  ax-in2 616  ax-io 710  ax-5 1458  ax-7 1459  ax-gen 1460  ax-ie1 1504  ax-ie2 1505  ax-8 1515  ax-10 1516  ax-11 1517  ax-i12 1518  ax-bndl 1520  ax-4 1521  ax-17 1537  ax-i9 1541  ax-ial 1545  ax-i5r 1546  ax-13 2162  ax-14 2163  ax-ext 2171  ax-coll 4133  ax-sep 4136  ax-nul 4144  ax-pow 4192  ax-pr 4227  ax-un 4451  ax-setind 4554  ax-iinf 4605  ax-cnex 7932  ax-resscn 7933  ax-1cn 7934  ax-1re 7935  ax-icn 7936  ax-addcl 7937  ax-addrcl 7938  ax-mulcl 7939  ax-mulrcl 7940  ax-addcom 7941  ax-mulcom 7942  ax-addass 7943  ax-mulass 7944  ax-distr 7945  ax-i2m1 7946  ax-0lt1 7947  ax-1rid 7948  ax-0id 7949  ax-rnegex 7950  ax-precex 7951  ax-cnre 7952  ax-pre-ltirr 7953  ax-pre-ltwlin 7954  ax-pre-lttrn 7955  ax-pre-apti 7956  ax-pre-ltadd 7957  ax-pre-mulgt0 7958  ax-pre-mulext 7959  ax-arch 7960  ax-caucvg 7961
This theorem depends on definitions:  df-bi 117  df-dc 836  df-3or 981  df-3an 982  df-tru 1367  df-fal 1370  df-nf 1472  df-sb 1774  df-eu 2041  df-mo 2042  df-clab 2176  df-cleq 2182  df-clel 2185  df-nfc 2321  df-ne 2361  df-nel 2456  df-ral 2473  df-rex 2474  df-reu 2475  df-rmo 2476  df-rab 2477  df-v 2754  df-sbc 2978  df-csb 3073  df-dif 3146  df-un 3148  df-in 3150  df-ss 3157  df-nul 3438  df-if 3550  df-pw 3592  df-sn 3613  df-pr 3614  df-op 3616  df-uni 3825  df-int 3860  df-iun 3903  df-br 4019  df-opab 4080  df-mpt 4081  df-tr 4117  df-id 4311  df-po 4314  df-iso 4315  df-iord 4384  df-on 4386  df-ilim 4387  df-suc 4389  df-iom 4608  df-xp 4650  df-rel 4651  df-cnv 4652  df-co 4653  df-dm 4654  df-rn 4655  df-res 4656  df-ima 4657  df-iota 5196  df-fun 5237  df-fn 5238  df-f 5239  df-f1 5240  df-fo 5241  df-f1o 5242  df-fv 5243  df-riota 5852  df-ov 5899  df-oprab 5900  df-mpo 5901  df-1st 6165  df-2nd 6166  df-recs 6330  df-frec 6416  df-er 6559  df-en 6767  df-fin 6769  df-sup 7013  df-pnf 8024  df-mnf 8025  df-xr 8026  df-ltxr 8027  df-le 8028  df-sub 8160  df-neg 8161  df-reap 8562  df-ap 8569  df-div 8660  df-inn 8950  df-2 9008  df-3 9009  df-4 9010  df-n0 9207  df-z 9284  df-uz 9559  df-rp 9684  df-fz 10039  df-seqfrec 10477  df-exp 10551  df-cj 10883  df-re 10884  df-im 10885  df-rsqrt 11039  df-abs 11040  df-clim 11319
This theorem is referenced by:  isumlessdc  11536
  Copyright terms: Public domain W3C validator