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

Theorem brecop 6262
 Description: Binary relation on a quotient set. Lemma for real number construction. (Contributed by NM, 29-Jan-1996.)
Hypotheses
Ref Expression
brecop.1 ∈ V
brecop.2 Er (𝐺 × 𝐺)
brecop.4 𝐻 = ((𝐺 × 𝐺) / )
brecop.5 = {⟨𝑥, 𝑦⟩ ∣ ((𝑥𝐻𝑦𝐻) ∧ ∃𝑧𝑤𝑣𝑢((𝑥 = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑))}
brecop.6 ((((𝑧𝐺𝑤𝐺) ∧ (𝐴𝐺𝐵𝐺)) ∧ ((𝑣𝐺𝑢𝐺) ∧ (𝐶𝐺𝐷𝐺))) → (([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] ) → (𝜑𝜓)))
Assertion
Ref Expression
brecop (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → ([⟨𝐴, 𝐵⟩] [⟨𝐶, 𝐷⟩] 𝜓))
Distinct variable groups:   𝑥,𝑦,𝑧,𝑤,𝑣,𝑢,𝐴   𝑥,𝐵,𝑦,𝑧,𝑤,𝑣,𝑢   𝑥,𝐶,𝑦,𝑧,𝑤,𝑣,𝑢   𝑥,𝐷,𝑦,𝑧,𝑤,𝑣,𝑢   𝑥, ,𝑦,𝑧,𝑤,𝑣,𝑢   𝑥,𝐻,𝑦   𝑧,𝐺,𝑤,𝑣,𝑢   𝜑,𝑥,𝑦   𝜓,𝑧,𝑤,𝑣,𝑢
Allowed substitution hints:   𝜑(𝑧,𝑤,𝑣,𝑢)   𝜓(𝑥,𝑦)   𝐺(𝑥,𝑦)   𝐻(𝑧,𝑤,𝑣,𝑢)   (𝑥,𝑦,𝑧,𝑤,𝑣,𝑢)

Proof of Theorem brecop
StepHypRef Expression
1 brecop.1 . . . 4 ∈ V
2 brecop.4 . . . 4 𝐻 = ((𝐺 × 𝐺) / )
31, 2ecopqsi 6227 . . 3 ((𝐴𝐺𝐵𝐺) → [⟨𝐴, 𝐵⟩] 𝐻)
41, 2ecopqsi 6227 . . 3 ((𝐶𝐺𝐷𝐺) → [⟨𝐶, 𝐷⟩] 𝐻)
5 df-br 3794 . . . . 5 ([⟨𝐴, 𝐵⟩] [⟨𝐶, 𝐷⟩] ↔ ⟨[⟨𝐴, 𝐵⟩] , [⟨𝐶, 𝐷⟩] ⟩ ∈ )
6 brecop.5 . . . . . 6 = {⟨𝑥, 𝑦⟩ ∣ ((𝑥𝐻𝑦𝐻) ∧ ∃𝑧𝑤𝑣𝑢((𝑥 = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑))}
76eleq2i 2146 . . . . 5 (⟨[⟨𝐴, 𝐵⟩] , [⟨𝐶, 𝐷⟩] ⟩ ∈ ↔ ⟨[⟨𝐴, 𝐵⟩] , [⟨𝐶, 𝐷⟩] ⟩ ∈ {⟨𝑥, 𝑦⟩ ∣ ((𝑥𝐻𝑦𝐻) ∧ ∃𝑧𝑤𝑣𝑢((𝑥 = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑))})
85, 7bitri 182 . . . 4 ([⟨𝐴, 𝐵⟩] [⟨𝐶, 𝐷⟩] ↔ ⟨[⟨𝐴, 𝐵⟩] , [⟨𝐶, 𝐷⟩] ⟩ ∈ {⟨𝑥, 𝑦⟩ ∣ ((𝑥𝐻𝑦𝐻) ∧ ∃𝑧𝑤𝑣𝑢((𝑥 = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑))})
9 eqeq1 2088 . . . . . . . 8 (𝑥 = [⟨𝐴, 𝐵⟩] → (𝑥 = [⟨𝑧, 𝑤⟩] ↔ [⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] ))
109anbi1d 453 . . . . . . 7 (𝑥 = [⟨𝐴, 𝐵⟩] → ((𝑥 = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] ) ↔ ([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] )))
1110anbi1d 453 . . . . . 6 (𝑥 = [⟨𝐴, 𝐵⟩] → (((𝑥 = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑) ↔ (([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑)))
12114exbidv 1792 . . . . 5 (𝑥 = [⟨𝐴, 𝐵⟩] → (∃𝑧𝑤𝑣𝑢((𝑥 = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑) ↔ ∃𝑧𝑤𝑣𝑢(([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑)))
13 eqeq1 2088 . . . . . . . 8 (𝑦 = [⟨𝐶, 𝐷⟩] → (𝑦 = [⟨𝑣, 𝑢⟩] ↔ [⟨𝐶, 𝐷⟩] = [⟨𝑣, 𝑢⟩] ))
1413anbi2d 452 . . . . . . 7 (𝑦 = [⟨𝐶, 𝐷⟩] → (([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] ) ↔ ([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] ∧ [⟨𝐶, 𝐷⟩] = [⟨𝑣, 𝑢⟩] )))
1514anbi1d 453 . . . . . 6 (𝑦 = [⟨𝐶, 𝐷⟩] → ((([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑) ↔ (([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] ∧ [⟨𝐶, 𝐷⟩] = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑)))
16154exbidv 1792 . . . . 5 (𝑦 = [⟨𝐶, 𝐷⟩] → (∃𝑧𝑤𝑣𝑢(([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑) ↔ ∃𝑧𝑤𝑣𝑢(([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] ∧ [⟨𝐶, 𝐷⟩] = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑)))
1712, 16opelopab2 4033 . . . 4 (([⟨𝐴, 𝐵⟩] 𝐻 ∧ [⟨𝐶, 𝐷⟩] 𝐻) → (⟨[⟨𝐴, 𝐵⟩] , [⟨𝐶, 𝐷⟩] ⟩ ∈ {⟨𝑥, 𝑦⟩ ∣ ((𝑥𝐻𝑦𝐻) ∧ ∃𝑧𝑤𝑣𝑢((𝑥 = [⟨𝑧, 𝑤⟩] 𝑦 = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑))} ↔ ∃𝑧𝑤𝑣𝑢(([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] ∧ [⟨𝐶, 𝐷⟩] = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑)))
188, 17syl5bb 190 . . 3 (([⟨𝐴, 𝐵⟩] 𝐻 ∧ [⟨𝐶, 𝐷⟩] 𝐻) → ([⟨𝐴, 𝐵⟩] [⟨𝐶, 𝐷⟩] ↔ ∃𝑧𝑤𝑣𝑢(([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] ∧ [⟨𝐶, 𝐷⟩] = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑)))
193, 4, 18syl2an 283 . 2 (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → ([⟨𝐴, 𝐵⟩] [⟨𝐶, 𝐷⟩] ↔ ∃𝑧𝑤𝑣𝑢(([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] ∧ [⟨𝐶, 𝐷⟩] = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑)))
20 opeq12 3580 . . . . . 6 ((𝑧 = 𝐴𝑤 = 𝐵) → ⟨𝑧, 𝑤⟩ = ⟨𝐴, 𝐵⟩)
2120eceq1d 6208 . . . . 5 ((𝑧 = 𝐴𝑤 = 𝐵) → [⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] )
22 opeq12 3580 . . . . . 6 ((𝑣 = 𝐶𝑢 = 𝐷) → ⟨𝑣, 𝑢⟩ = ⟨𝐶, 𝐷⟩)
2322eceq1d 6208 . . . . 5 ((𝑣 = 𝐶𝑢 = 𝐷) → [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] )
2421, 23anim12i 331 . . . 4 (((𝑧 = 𝐴𝑤 = 𝐵) ∧ (𝑣 = 𝐶𝑢 = 𝐷)) → ([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] ))
25 opelxpi 4402 . . . . . . . 8 ((𝐴𝐺𝐵𝐺) → ⟨𝐴, 𝐵⟩ ∈ (𝐺 × 𝐺))
26 opelxp 4400 . . . . . . . . 9 (⟨𝑧, 𝑤⟩ ∈ (𝐺 × 𝐺) ↔ (𝑧𝐺𝑤𝐺))
27 brecop.2 . . . . . . . . . . 11 Er (𝐺 × 𝐺)
2827a1i 9 . . . . . . . . . 10 ([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] Er (𝐺 × 𝐺))
29 id 19 . . . . . . . . . 10 ([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] → [⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] )
3028, 29ereldm 6215 . . . . . . . . 9 ([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] → (⟨𝑧, 𝑤⟩ ∈ (𝐺 × 𝐺) ↔ ⟨𝐴, 𝐵⟩ ∈ (𝐺 × 𝐺)))
3126, 30syl5bbr 192 . . . . . . . 8 ([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] → ((𝑧𝐺𝑤𝐺) ↔ ⟨𝐴, 𝐵⟩ ∈ (𝐺 × 𝐺)))
3225, 31syl5ibr 154 . . . . . . 7 ([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] → ((𝐴𝐺𝐵𝐺) → (𝑧𝐺𝑤𝐺)))
33 opelxpi 4402 . . . . . . . 8 ((𝐶𝐺𝐷𝐺) → ⟨𝐶, 𝐷⟩ ∈ (𝐺 × 𝐺))
34 opelxp 4400 . . . . . . . . 9 (⟨𝑣, 𝑢⟩ ∈ (𝐺 × 𝐺) ↔ (𝑣𝐺𝑢𝐺))
3527a1i 9 . . . . . . . . . 10 ([⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] Er (𝐺 × 𝐺))
36 id 19 . . . . . . . . . 10 ([⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] → [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] )
3735, 36ereldm 6215 . . . . . . . . 9 ([⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] → (⟨𝑣, 𝑢⟩ ∈ (𝐺 × 𝐺) ↔ ⟨𝐶, 𝐷⟩ ∈ (𝐺 × 𝐺)))
3834, 37syl5bbr 192 . . . . . . . 8 ([⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] → ((𝑣𝐺𝑢𝐺) ↔ ⟨𝐶, 𝐷⟩ ∈ (𝐺 × 𝐺)))
3933, 38syl5ibr 154 . . . . . . 7 ([⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] → ((𝐶𝐺𝐷𝐺) → (𝑣𝐺𝑢𝐺)))
4032, 39im2anan9 563 . . . . . 6 (([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] ) → (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → ((𝑧𝐺𝑤𝐺) ∧ (𝑣𝐺𝑢𝐺))))
41 brecop.6 . . . . . . . . 9 ((((𝑧𝐺𝑤𝐺) ∧ (𝐴𝐺𝐵𝐺)) ∧ ((𝑣𝐺𝑢𝐺) ∧ (𝐶𝐺𝐷𝐺))) → (([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] ) → (𝜑𝜓)))
4241an4s 553 . . . . . . . 8 ((((𝑧𝐺𝑤𝐺) ∧ (𝑣𝐺𝑢𝐺)) ∧ ((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺))) → (([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] ) → (𝜑𝜓)))
4342ex 113 . . . . . . 7 (((𝑧𝐺𝑤𝐺) ∧ (𝑣𝐺𝑢𝐺)) → (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → (([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] ) → (𝜑𝜓))))
4443com13 79 . . . . . 6 (([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] ) → (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → (((𝑧𝐺𝑤𝐺) ∧ (𝑣𝐺𝑢𝐺)) → (𝜑𝜓))))
4540, 44mpdd 40 . . . . 5 (([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] ) → (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → (𝜑𝜓)))
4645pm5.74d 180 . . . 4 (([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] ) → ((((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → 𝜑) ↔ (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → 𝜓)))
4724, 46cgsex4g 2637 . . 3 (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → (∃𝑧𝑤𝑣𝑢(([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] ) ∧ (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → 𝜑)) ↔ (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → 𝜓)))
48 eqcom 2084 . . . . . . 7 ([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] ↔ [⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] )
49 eqcom 2084 . . . . . . 7 ([⟨𝐶, 𝐷⟩] = [⟨𝑣, 𝑢⟩] ↔ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] )
5048, 49anbi12i 448 . . . . . 6 (([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] ∧ [⟨𝐶, 𝐷⟩] = [⟨𝑣, 𝑢⟩] ) ↔ ([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] ))
5150a1i 9 . . . . 5 (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → (([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] ∧ [⟨𝐶, 𝐷⟩] = [⟨𝑣, 𝑢⟩] ) ↔ ([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] )))
52 biimt 239 . . . . 5 (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → (𝜑 ↔ (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → 𝜑)))
5351, 52anbi12d 457 . . . 4 (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → ((([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] ∧ [⟨𝐶, 𝐷⟩] = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑) ↔ (([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] ) ∧ (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → 𝜑))))
54534exbidv 1792 . . 3 (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → (∃𝑧𝑤𝑣𝑢(([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] ∧ [⟨𝐶, 𝐷⟩] = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑) ↔ ∃𝑧𝑤𝑣𝑢(([⟨𝑧, 𝑤⟩] = [⟨𝐴, 𝐵⟩] ∧ [⟨𝑣, 𝑢⟩] = [⟨𝐶, 𝐷⟩] ) ∧ (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → 𝜑))))
55 biimt 239 . . 3 (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → (𝜓 ↔ (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → 𝜓)))
5647, 54, 553bitr4d 218 . 2 (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → (∃𝑧𝑤𝑣𝑢(([⟨𝐴, 𝐵⟩] = [⟨𝑧, 𝑤⟩] ∧ [⟨𝐶, 𝐷⟩] = [⟨𝑣, 𝑢⟩] ) ∧ 𝜑) ↔ 𝜓))
5719, 56bitrd 186 1 (((𝐴𝐺𝐵𝐺) ∧ (𝐶𝐺𝐷𝐺)) → ([⟨𝐴, 𝐵⟩] [⟨𝐶, 𝐷⟩] 𝜓))
 Colors of variables: wff set class Syntax hints:   → wi 4   ∧ wa 102   ↔ wb 103   = wceq 1285  ∃wex 1422   ∈ wcel 1434  Vcvv 2602  ⟨cop 3409   class class class wbr 3793  {copab 3846   × cxp 4369   Er wer 6169  [cec 6170   / cqs 6171 This theorem was proved from axioms:  ax-1 5  ax-2 6  ax-mp 7  ax-ia1 104  ax-ia2 105  ax-ia3 106  ax-io 663  ax-5 1377  ax-7 1378  ax-gen 1379  ax-ie1 1423  ax-ie2 1424  ax-8 1436  ax-10 1437  ax-11 1438  ax-i12 1439  ax-bndl 1440  ax-4 1441  ax-13 1445  ax-14 1446  ax-17 1460  ax-i9 1464  ax-ial 1468  ax-i5r 1469  ax-ext 2064  ax-sep 3904  ax-pow 3956  ax-pr 3972  ax-un 4196 This theorem depends on definitions:  df-bi 115  df-3an 922  df-tru 1288  df-nf 1391  df-sb 1687  df-eu 1945  df-mo 1946  df-clab 2069  df-cleq 2075  df-clel 2078  df-nfc 2209  df-ral 2354  df-rex 2355  df-v 2604  df-sbc 2817  df-un 2978  df-in 2980  df-ss 2987  df-pw 3392  df-sn 3412  df-pr 3413  df-op 3415  df-uni 3610  df-br 3794  df-opab 3848  df-xp 4377  df-cnv 4379  df-dm 4381  df-rn 4382  df-res 4383  df-ima 4384  df-er 6172  df-ec 6174  df-qs 6178 This theorem is referenced by:  ordpipqqs  6626  ltsrprg  6986
 Copyright terms: Public domain W3C validator