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

Theorem fsum2d 15118
Description: Write a double sum as a sum over a two-dimensional region. Note that 𝐵(𝑗) is a function of 𝑗. (Contributed by Mario Carneiro, 27-Apr-2014.)
Hypotheses
Ref Expression
fsum2d.1 (𝑧 = ⟨𝑗, 𝑘⟩ → 𝐷 = 𝐶)
fsum2d.2 (𝜑𝐴 ∈ Fin)
fsum2d.3 ((𝜑𝑗𝐴) → 𝐵 ∈ Fin)
fsum2d.4 ((𝜑 ∧ (𝑗𝐴𝑘𝐵)) → 𝐶 ∈ ℂ)
Assertion
Ref Expression
fsum2d (𝜑 → Σ𝑗𝐴 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝐴 ({𝑗} × 𝐵)𝐷)
Distinct variable groups:   𝑗,𝑘,𝑧,𝐴   𝐵,𝑘,𝑧   𝐷,𝑗,𝑘   𝑧,𝐶   𝜑,𝑗,𝑘,𝑧
Allowed substitution hints:   𝐵(𝑗)   𝐶(𝑗,𝑘)   𝐷(𝑧)

Proof of Theorem fsum2d
Dummy variables 𝑤 𝑥 𝑦 are mutually distinct and distinct from all other variables.
StepHypRef Expression
1 ssid 3937 . 2 𝐴𝐴
2 fsum2d.2 . . 3 (𝜑𝐴 ∈ Fin)
3 sseq1 3940 . . . . . 6 (𝑤 = ∅ → (𝑤𝐴 ↔ ∅ ⊆ 𝐴))
4 sumeq1 15037 . . . . . . 7 (𝑤 = ∅ → Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑗 ∈ ∅ Σ𝑘𝐵 𝐶)
5 iuneq1 4897 . . . . . . . 8 (𝑤 = ∅ → 𝑗𝑤 ({𝑗} × 𝐵) = 𝑗 ∈ ∅ ({𝑗} × 𝐵))
65sumeq1d 15050 . . . . . . 7 (𝑤 = ∅ → Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷 = Σ𝑧 𝑗 ∈ ∅ ({𝑗} × 𝐵)𝐷)
74, 6eqeq12d 2814 . . . . . 6 (𝑤 = ∅ → (Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷 ↔ Σ𝑗 ∈ ∅ Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ ∅ ({𝑗} × 𝐵)𝐷))
83, 7imbi12d 348 . . . . 5 (𝑤 = ∅ → ((𝑤𝐴 → Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷) ↔ (∅ ⊆ 𝐴 → Σ𝑗 ∈ ∅ Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ ∅ ({𝑗} × 𝐵)𝐷)))
98imbi2d 344 . . . 4 (𝑤 = ∅ → ((𝜑 → (𝑤𝐴 → Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷)) ↔ (𝜑 → (∅ ⊆ 𝐴 → Σ𝑗 ∈ ∅ Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ ∅ ({𝑗} × 𝐵)𝐷))))
10 sseq1 3940 . . . . . 6 (𝑤 = 𝑥 → (𝑤𝐴𝑥𝐴))
11 sumeq1 15037 . . . . . . 7 (𝑤 = 𝑥 → Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑗𝑥 Σ𝑘𝐵 𝐶)
12 iuneq1 4897 . . . . . . . 8 (𝑤 = 𝑥 𝑗𝑤 ({𝑗} × 𝐵) = 𝑗𝑥 ({𝑗} × 𝐵))
1312sumeq1d 15050 . . . . . . 7 (𝑤 = 𝑥 → Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷)
1411, 13eqeq12d 2814 . . . . . 6 (𝑤 = 𝑥 → (Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷 ↔ Σ𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷))
1510, 14imbi12d 348 . . . . 5 (𝑤 = 𝑥 → ((𝑤𝐴 → Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷) ↔ (𝑥𝐴 → Σ𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷)))
1615imbi2d 344 . . . 4 (𝑤 = 𝑥 → ((𝜑 → (𝑤𝐴 → Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷)) ↔ (𝜑 → (𝑥𝐴 → Σ𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷))))
17 sseq1 3940 . . . . . 6 (𝑤 = (𝑥 ∪ {𝑦}) → (𝑤𝐴 ↔ (𝑥 ∪ {𝑦}) ⊆ 𝐴))
18 sumeq1 15037 . . . . . . 7 (𝑤 = (𝑥 ∪ {𝑦}) → Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑗 ∈ (𝑥 ∪ {𝑦})Σ𝑘𝐵 𝐶)
19 iuneq1 4897 . . . . . . . 8 (𝑤 = (𝑥 ∪ {𝑦}) → 𝑗𝑤 ({𝑗} × 𝐵) = 𝑗 ∈ (𝑥 ∪ {𝑦})({𝑗} × 𝐵))
2019sumeq1d 15050 . . . . . . 7 (𝑤 = (𝑥 ∪ {𝑦}) → Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷 = Σ𝑧 𝑗 ∈ (𝑥 ∪ {𝑦})({𝑗} × 𝐵)𝐷)
2118, 20eqeq12d 2814 . . . . . 6 (𝑤 = (𝑥 ∪ {𝑦}) → (Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷 ↔ Σ𝑗 ∈ (𝑥 ∪ {𝑦})Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ (𝑥 ∪ {𝑦})({𝑗} × 𝐵)𝐷))
2217, 21imbi12d 348 . . . . 5 (𝑤 = (𝑥 ∪ {𝑦}) → ((𝑤𝐴 → Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷) ↔ ((𝑥 ∪ {𝑦}) ⊆ 𝐴 → Σ𝑗 ∈ (𝑥 ∪ {𝑦})Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ (𝑥 ∪ {𝑦})({𝑗} × 𝐵)𝐷)))
2322imbi2d 344 . . . 4 (𝑤 = (𝑥 ∪ {𝑦}) → ((𝜑 → (𝑤𝐴 → Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷)) ↔ (𝜑 → ((𝑥 ∪ {𝑦}) ⊆ 𝐴 → Σ𝑗 ∈ (𝑥 ∪ {𝑦})Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ (𝑥 ∪ {𝑦})({𝑗} × 𝐵)𝐷))))
24 sseq1 3940 . . . . . 6 (𝑤 = 𝐴 → (𝑤𝐴𝐴𝐴))
25 sumeq1 15037 . . . . . . 7 (𝑤 = 𝐴 → Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑗𝐴 Σ𝑘𝐵 𝐶)
26 iuneq1 4897 . . . . . . . 8 (𝑤 = 𝐴 𝑗𝑤 ({𝑗} × 𝐵) = 𝑗𝐴 ({𝑗} × 𝐵))
2726sumeq1d 15050 . . . . . . 7 (𝑤 = 𝐴 → Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷 = Σ𝑧 𝑗𝐴 ({𝑗} × 𝐵)𝐷)
2825, 27eqeq12d 2814 . . . . . 6 (𝑤 = 𝐴 → (Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷 ↔ Σ𝑗𝐴 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝐴 ({𝑗} × 𝐵)𝐷))
2924, 28imbi12d 348 . . . . 5 (𝑤 = 𝐴 → ((𝑤𝐴 → Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷) ↔ (𝐴𝐴 → Σ𝑗𝐴 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝐴 ({𝑗} × 𝐵)𝐷)))
3029imbi2d 344 . . . 4 (𝑤 = 𝐴 → ((𝜑 → (𝑤𝐴 → Σ𝑗𝑤 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑤 ({𝑗} × 𝐵)𝐷)) ↔ (𝜑 → (𝐴𝐴 → Σ𝑗𝐴 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝐴 ({𝑗} × 𝐵)𝐷))))
31 sum0 15070 . . . . . 6 Σ𝑧 ∈ ∅ 𝐷 = 0
32 0iun 4949 . . . . . . 7 𝑗 ∈ ∅ ({𝑗} × 𝐵) = ∅
3332sumeq1i 15047 . . . . . 6 Σ𝑧 𝑗 ∈ ∅ ({𝑗} × 𝐵)𝐷 = Σ𝑧 ∈ ∅ 𝐷
34 sum0 15070 . . . . . 6 Σ𝑗 ∈ ∅ Σ𝑘𝐵 𝐶 = 0
3531, 33, 343eqtr4ri 2832 . . . . 5 Σ𝑗 ∈ ∅ Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ ∅ ({𝑗} × 𝐵)𝐷
36352a1i 12 . . . 4 (𝜑 → (∅ ⊆ 𝐴 → Σ𝑗 ∈ ∅ Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ ∅ ({𝑗} × 𝐵)𝐷))
37 ssun1 4099 . . . . . . . . . 10 𝑥 ⊆ (𝑥 ∪ {𝑦})
38 sstr 3923 . . . . . . . . . 10 ((𝑥 ⊆ (𝑥 ∪ {𝑦}) ∧ (𝑥 ∪ {𝑦}) ⊆ 𝐴) → 𝑥𝐴)
3937, 38mpan 689 . . . . . . . . 9 ((𝑥 ∪ {𝑦}) ⊆ 𝐴𝑥𝐴)
4039imim1i 63 . . . . . . . 8 ((𝑥𝐴 → Σ𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷) → ((𝑥 ∪ {𝑦}) ⊆ 𝐴 → Σ𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷))
41 fsum2d.1 . . . . . . . . . . 11 (𝑧 = ⟨𝑗, 𝑘⟩ → 𝐷 = 𝐶)
42 simpll 766 . . . . . . . . . . . 12 (((𝜑 ∧ ¬ 𝑦𝑥) ∧ (𝑥 ∪ {𝑦}) ⊆ 𝐴) → 𝜑)
4342, 2syl 17 . . . . . . . . . . 11 (((𝜑 ∧ ¬ 𝑦𝑥) ∧ (𝑥 ∪ {𝑦}) ⊆ 𝐴) → 𝐴 ∈ Fin)
44 fsum2d.3 . . . . . . . . . . . 12 ((𝜑𝑗𝐴) → 𝐵 ∈ Fin)
4542, 44sylan 583 . . . . . . . . . . 11 ((((𝜑 ∧ ¬ 𝑦𝑥) ∧ (𝑥 ∪ {𝑦}) ⊆ 𝐴) ∧ 𝑗𝐴) → 𝐵 ∈ Fin)
46 fsum2d.4 . . . . . . . . . . . 12 ((𝜑 ∧ (𝑗𝐴𝑘𝐵)) → 𝐶 ∈ ℂ)
4742, 46sylan 583 . . . . . . . . . . 11 ((((𝜑 ∧ ¬ 𝑦𝑥) ∧ (𝑥 ∪ {𝑦}) ⊆ 𝐴) ∧ (𝑗𝐴𝑘𝐵)) → 𝐶 ∈ ℂ)
48 simplr 768 . . . . . . . . . . 11 (((𝜑 ∧ ¬ 𝑦𝑥) ∧ (𝑥 ∪ {𝑦}) ⊆ 𝐴) → ¬ 𝑦𝑥)
49 simpr 488 . . . . . . . . . . 11 (((𝜑 ∧ ¬ 𝑦𝑥) ∧ (𝑥 ∪ {𝑦}) ⊆ 𝐴) → (𝑥 ∪ {𝑦}) ⊆ 𝐴)
50 biid 264 . . . . . . . . . . 11 𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷 ↔ Σ𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷)
5141, 43, 45, 47, 48, 49, 50fsum2dlem 15117 . . . . . . . . . 10 ((((𝜑 ∧ ¬ 𝑦𝑥) ∧ (𝑥 ∪ {𝑦}) ⊆ 𝐴) ∧ Σ𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷) → Σ𝑗 ∈ (𝑥 ∪ {𝑦})Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ (𝑥 ∪ {𝑦})({𝑗} × 𝐵)𝐷)
5251exp31 423 . . . . . . . . 9 ((𝜑 ∧ ¬ 𝑦𝑥) → ((𝑥 ∪ {𝑦}) ⊆ 𝐴 → (Σ𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷 → Σ𝑗 ∈ (𝑥 ∪ {𝑦})Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ (𝑥 ∪ {𝑦})({𝑗} × 𝐵)𝐷)))
5352a2d 29 . . . . . . . 8 ((𝜑 ∧ ¬ 𝑦𝑥) → (((𝑥 ∪ {𝑦}) ⊆ 𝐴 → Σ𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷) → ((𝑥 ∪ {𝑦}) ⊆ 𝐴 → Σ𝑗 ∈ (𝑥 ∪ {𝑦})Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ (𝑥 ∪ {𝑦})({𝑗} × 𝐵)𝐷)))
5440, 53syl5 34 . . . . . . 7 ((𝜑 ∧ ¬ 𝑦𝑥) → ((𝑥𝐴 → Σ𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷) → ((𝑥 ∪ {𝑦}) ⊆ 𝐴 → Σ𝑗 ∈ (𝑥 ∪ {𝑦})Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ (𝑥 ∪ {𝑦})({𝑗} × 𝐵)𝐷)))
5554expcom 417 . . . . . 6 𝑦𝑥 → (𝜑 → ((𝑥𝐴 → Σ𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷) → ((𝑥 ∪ {𝑦}) ⊆ 𝐴 → Σ𝑗 ∈ (𝑥 ∪ {𝑦})Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ (𝑥 ∪ {𝑦})({𝑗} × 𝐵)𝐷))))
5655a2d 29 . . . . 5 𝑦𝑥 → ((𝜑 → (𝑥𝐴 → Σ𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷)) → (𝜑 → ((𝑥 ∪ {𝑦}) ⊆ 𝐴 → Σ𝑗 ∈ (𝑥 ∪ {𝑦})Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ (𝑥 ∪ {𝑦})({𝑗} × 𝐵)𝐷))))
5756adantl 485 . . . 4 ((𝑥 ∈ Fin ∧ ¬ 𝑦𝑥) → ((𝜑 → (𝑥𝐴 → Σ𝑗𝑥 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝑥 ({𝑗} × 𝐵)𝐷)) → (𝜑 → ((𝑥 ∪ {𝑦}) ⊆ 𝐴 → Σ𝑗 ∈ (𝑥 ∪ {𝑦})Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗 ∈ (𝑥 ∪ {𝑦})({𝑗} × 𝐵)𝐷))))
589, 16, 23, 30, 36, 57findcard2s 8743 . . 3 (𝐴 ∈ Fin → (𝜑 → (𝐴𝐴 → Σ𝑗𝐴 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝐴 ({𝑗} × 𝐵)𝐷)))
592, 58mpcom 38 . 2 (𝜑 → (𝐴𝐴 → Σ𝑗𝐴 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝐴 ({𝑗} × 𝐵)𝐷))
601, 59mpi 20 1 (𝜑 → Σ𝑗𝐴 Σ𝑘𝐵 𝐶 = Σ𝑧 𝑗𝐴 ({𝑗} × 𝐵)𝐷)
Colors of variables: wff setvar class
Syntax hints:  ¬ wn 3  wi 4  wa 399   = wceq 1538  wcel 2111  cun 3879  wss 3881  c0 4243  {csn 4525  cop 4531   ciun 4881   × cxp 5517  Fincfn 8492  cc 10524  0cc0 10526  Σcsu 15034
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 1911  ax-6 1970  ax-7 2015  ax-8 2113  ax-9 2121  ax-10 2142  ax-11 2158  ax-12 2175  ax-ext 2770  ax-rep 5154  ax-sep 5167  ax-nul 5174  ax-pow 5231  ax-pr 5295  ax-un 7441  ax-inf2 9088  ax-cnex 10582  ax-resscn 10583  ax-1cn 10584  ax-icn 10585  ax-addcl 10586  ax-addrcl 10587  ax-mulcl 10588  ax-mulrcl 10589  ax-mulcom 10590  ax-addass 10591  ax-mulass 10592  ax-distr 10593  ax-i2m1 10594  ax-1ne0 10595  ax-1rid 10596  ax-rnegex 10597  ax-rrecex 10598  ax-cnre 10599  ax-pre-lttri 10600  ax-pre-lttrn 10601  ax-pre-ltadd 10602  ax-pre-mulgt0 10603  ax-pre-sup 10604
This theorem depends on definitions:  df-bi 210  df-an 400  df-or 845  df-3or 1085  df-3an 1086  df-tru 1541  df-fal 1551  df-ex 1782  df-nf 1786  df-sb 2070  df-mo 2598  df-eu 2629  df-clab 2777  df-cleq 2791  df-clel 2870  df-nfc 2938  df-ne 2988  df-nel 3092  df-ral 3111  df-rex 3112  df-reu 3113  df-rmo 3114  df-rab 3115  df-v 3443  df-sbc 3721  df-csb 3829  df-dif 3884  df-un 3886  df-in 3888  df-ss 3898  df-pss 3900  df-nul 4244  df-if 4426  df-pw 4499  df-sn 4526  df-pr 4528  df-tp 4530  df-op 4532  df-uni 4801  df-int 4839  df-iun 4883  df-br 5031  df-opab 5093  df-mpt 5111  df-tr 5137  df-id 5425  df-eprel 5430  df-po 5438  df-so 5439  df-fr 5478  df-se 5479  df-we 5480  df-xp 5525  df-rel 5526  df-cnv 5527  df-co 5528  df-dm 5529  df-rn 5530  df-res 5531  df-ima 5532  df-pred 6116  df-ord 6162  df-on 6163  df-lim 6164  df-suc 6165  df-iota 6283  df-fun 6326  df-fn 6327  df-f 6328  df-f1 6329  df-fo 6330  df-f1o 6331  df-fv 6332  df-isom 6333  df-riota 7093  df-ov 7138  df-oprab 7139  df-mpo 7140  df-om 7561  df-1st 7671  df-2nd 7672  df-wrecs 7930  df-recs 7991  df-rdg 8029  df-1o 8085  df-oadd 8089  df-er 8272  df-en 8493  df-dom 8494  df-sdom 8495  df-fin 8496  df-sup 8890  df-oi 8958  df-card 9352  df-pnf 10666  df-mnf 10667  df-xr 10668  df-ltxr 10669  df-le 10670  df-sub 10861  df-neg 10862  df-div 11287  df-nn 11626  df-2 11688  df-3 11689  df-n0 11886  df-z 11970  df-uz 12232  df-rp 12378  df-fz 12886  df-fzo 13029  df-seq 13365  df-exp 13426  df-hash 13687  df-cj 14450  df-re 14451  df-im 14452  df-sqrt 14586  df-abs 14587  df-clim 14837  df-sum 15035
This theorem is referenced by:  fsumxp  15119  fsumcom2  15121  ovoliunlem1  24106  fsumvma  25797  fsumiunle  30571  eulerpartlemgs2  31748  dvnprodlem2  42589
  Copyright terms: Public domain W3C validator