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

Theorem ccatalpha 13321
 Description: A concatenation of two arbitrary words is a word over an alphabet iff the symbols of both words belong to the alphabet. (Contributed by AV, 28-Feb-2021.)
Assertion
Ref Expression
ccatalpha ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → ((𝐴 ++ 𝐵) ∈ Word 𝑆 ↔ (𝐴 ∈ Word 𝑆𝐵 ∈ Word 𝑆)))

Proof of Theorem ccatalpha
Dummy variables 𝑥 𝑦 are mutually distinct and distinct from all other variables.
StepHypRef Expression
1 ccatfval 13304 . . . 4 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → (𝐴 ++ 𝐵) = (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))))
21eleq1d 2683 . . 3 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → ((𝐴 ++ 𝐵) ∈ Word 𝑆 ↔ (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))) ∈ Word 𝑆))
3 wrdf 13256 . . . 4 ((𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))) ∈ Word 𝑆 → (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))):(0..^(#‘(𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))))))⟶𝑆)
4 funmpt 5889 . . . . . . . . 9 Fun (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))))
5 fzofi 12720 . . . . . . . . . . 11 (0..^((#‘𝐴) + (#‘𝐵))) ∈ Fin
6 mptfi 8216 . . . . . . . . . . 11 ((0..^((#‘𝐴) + (#‘𝐵))) ∈ Fin → (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))) ∈ Fin)
75, 6ax-mp 5 . . . . . . . . . 10 (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))) ∈ Fin
8 hashfun 13171 . . . . . . . . . 10 ((𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))) ∈ Fin → (Fun (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))) ↔ (#‘(𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))))) = (#‘dom (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))))))
97, 8mp1i 13 . . . . . . . . 9 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → (Fun (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))) ↔ (#‘(𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))))) = (#‘dom (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))))))
104, 9mpbii 223 . . . . . . . 8 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → (#‘(𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))))) = (#‘dom (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))))))
11 dmmptg 5596 . . . . . . . . . . 11 (∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ V → dom (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))) = (0..^((#‘𝐴) + (#‘𝐵))))
12 fvex 6163 . . . . . . . . . . . . 13 (𝐴𝑥) ∈ V
13 fvex 6163 . . . . . . . . . . . . 13 (𝐵‘(𝑥 − (#‘𝐴))) ∈ V
1412, 13ifex 4133 . . . . . . . . . . . 12 if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ V
1514a1i 11 . . . . . . . . . . 11 (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) → if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ V)
1611, 15mprg 2921 . . . . . . . . . 10 dom (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))) = (0..^((#‘𝐴) + (#‘𝐵)))
1716fveq2i 6156 . . . . . . . . 9 (#‘dom (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))))) = (#‘(0..^((#‘𝐴) + (#‘𝐵))))
18 lencl 13270 . . . . . . . . . . 11 (𝐴 ∈ Word V → (#‘𝐴) ∈ ℕ0)
19 lencl 13270 . . . . . . . . . . 11 (𝐵 ∈ Word V → (#‘𝐵) ∈ ℕ0)
20 nn0addcl 11279 . . . . . . . . . . 11 (((#‘𝐴) ∈ ℕ0 ∧ (#‘𝐵) ∈ ℕ0) → ((#‘𝐴) + (#‘𝐵)) ∈ ℕ0)
2118, 19, 20syl2an 494 . . . . . . . . . 10 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → ((#‘𝐴) + (#‘𝐵)) ∈ ℕ0)
22 hashfzo0 13164 . . . . . . . . . 10 (((#‘𝐴) + (#‘𝐵)) ∈ ℕ0 → (#‘(0..^((#‘𝐴) + (#‘𝐵)))) = ((#‘𝐴) + (#‘𝐵)))
2321, 22syl 17 . . . . . . . . 9 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → (#‘(0..^((#‘𝐴) + (#‘𝐵)))) = ((#‘𝐴) + (#‘𝐵)))
2417, 23syl5eq 2667 . . . . . . . 8 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → (#‘dom (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))))) = ((#‘𝐴) + (#‘𝐵)))
2510, 24eqtrd 2655 . . . . . . 7 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → (#‘(𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))))) = ((#‘𝐴) + (#‘𝐵)))
2625oveq2d 6626 . . . . . 6 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → (0..^(#‘(𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))))) = (0..^((#‘𝐴) + (#‘𝐵))))
2726feq2d 5993 . . . . 5 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → ((𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))):(0..^(#‘(𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))))))⟶𝑆 ↔ (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))):(0..^((#‘𝐴) + (#‘𝐵)))⟶𝑆))
28 eqid 2621 . . . . . . 7 (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))) = (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))))
2928fmpt 6342 . . . . . 6 (∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆 ↔ (𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))):(0..^((#‘𝐴) + (#‘𝐵)))⟶𝑆)
30 simpl 473 . . . . . . . . 9 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → 𝐴 ∈ Word V)
31 nn0cn 11253 . . . . . . . . . . . . . . . . . . 19 ((#‘𝐴) ∈ ℕ0 → (#‘𝐴) ∈ ℂ)
32 nn0cn 11253 . . . . . . . . . . . . . . . . . . 19 ((#‘𝐵) ∈ ℕ0 → (#‘𝐵) ∈ ℂ)
33 addcom 10173 . . . . . . . . . . . . . . . . . . 19 (((#‘𝐴) ∈ ℂ ∧ (#‘𝐵) ∈ ℂ) → ((#‘𝐴) + (#‘𝐵)) = ((#‘𝐵) + (#‘𝐴)))
3431, 32, 33syl2an 494 . . . . . . . . . . . . . . . . . 18 (((#‘𝐴) ∈ ℕ0 ∧ (#‘𝐵) ∈ ℕ0) → ((#‘𝐴) + (#‘𝐵)) = ((#‘𝐵) + (#‘𝐴)))
35 nn0z 11351 . . . . . . . . . . . . . . . . . . . . 21 ((#‘𝐴) ∈ ℕ0 → (#‘𝐴) ∈ ℤ)
3635anim1i 591 . . . . . . . . . . . . . . . . . . . 20 (((#‘𝐴) ∈ ℕ0 ∧ (#‘𝐵) ∈ ℕ0) → ((#‘𝐴) ∈ ℤ ∧ (#‘𝐵) ∈ ℕ0))
3736ancomd 467 . . . . . . . . . . . . . . . . . . 19 (((#‘𝐴) ∈ ℕ0 ∧ (#‘𝐵) ∈ ℕ0) → ((#‘𝐵) ∈ ℕ0 ∧ (#‘𝐴) ∈ ℤ))
38 nn0pzuz 11696 . . . . . . . . . . . . . . . . . . 19 (((#‘𝐵) ∈ ℕ0 ∧ (#‘𝐴) ∈ ℤ) → ((#‘𝐵) + (#‘𝐴)) ∈ (ℤ‘(#‘𝐴)))
3937, 38syl 17 . . . . . . . . . . . . . . . . . 18 (((#‘𝐴) ∈ ℕ0 ∧ (#‘𝐵) ∈ ℕ0) → ((#‘𝐵) + (#‘𝐴)) ∈ (ℤ‘(#‘𝐴)))
4034, 39eqeltrd 2698 . . . . . . . . . . . . . . . . 17 (((#‘𝐴) ∈ ℕ0 ∧ (#‘𝐵) ∈ ℕ0) → ((#‘𝐴) + (#‘𝐵)) ∈ (ℤ‘(#‘𝐴)))
4118, 19, 40syl2an 494 . . . . . . . . . . . . . . . 16 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → ((#‘𝐴) + (#‘𝐵)) ∈ (ℤ‘(#‘𝐴)))
42 fzoss2 12444 . . . . . . . . . . . . . . . 16 (((#‘𝐴) + (#‘𝐵)) ∈ (ℤ‘(#‘𝐴)) → (0..^(#‘𝐴)) ⊆ (0..^((#‘𝐴) + (#‘𝐵))))
4341, 42syl 17 . . . . . . . . . . . . . . 15 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → (0..^(#‘𝐴)) ⊆ (0..^((#‘𝐴) + (#‘𝐵))))
4443sselda 3587 . . . . . . . . . . . . . 14 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐴))) → 𝑦 ∈ (0..^((#‘𝐴) + (#‘𝐵))))
45 eleq1 2686 . . . . . . . . . . . . . . . . 17 (𝑥 = 𝑦 → (𝑥 ∈ (0..^(#‘𝐴)) ↔ 𝑦 ∈ (0..^(#‘𝐴))))
46 fveq2 6153 . . . . . . . . . . . . . . . . 17 (𝑥 = 𝑦 → (𝐴𝑥) = (𝐴𝑦))
47 oveq1 6617 . . . . . . . . . . . . . . . . . 18 (𝑥 = 𝑦 → (𝑥 − (#‘𝐴)) = (𝑦 − (#‘𝐴)))
4847fveq2d 6157 . . . . . . . . . . . . . . . . 17 (𝑥 = 𝑦 → (𝐵‘(𝑥 − (#‘𝐴))) = (𝐵‘(𝑦 − (#‘𝐴))))
4945, 46, 48ifbieq12d 4090 . . . . . . . . . . . . . . . 16 (𝑥 = 𝑦 → if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) = if(𝑦 ∈ (0..^(#‘𝐴)), (𝐴𝑦), (𝐵‘(𝑦 − (#‘𝐴)))))
5049eleq1d 2683 . . . . . . . . . . . . . . 15 (𝑥 = 𝑦 → (if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆 ↔ if(𝑦 ∈ (0..^(#‘𝐴)), (𝐴𝑦), (𝐵‘(𝑦 − (#‘𝐴)))) ∈ 𝑆))
5150rspcv 3294 . . . . . . . . . . . . . 14 (𝑦 ∈ (0..^((#‘𝐴) + (#‘𝐵))) → (∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆 → if(𝑦 ∈ (0..^(#‘𝐴)), (𝐴𝑦), (𝐵‘(𝑦 − (#‘𝐴)))) ∈ 𝑆))
5244, 51syl 17 . . . . . . . . . . . . 13 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐴))) → (∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆 → if(𝑦 ∈ (0..^(#‘𝐴)), (𝐴𝑦), (𝐵‘(𝑦 − (#‘𝐴)))) ∈ 𝑆))
53 iftrue 4069 . . . . . . . . . . . . . . 15 (𝑦 ∈ (0..^(#‘𝐴)) → if(𝑦 ∈ (0..^(#‘𝐴)), (𝐴𝑦), (𝐵‘(𝑦 − (#‘𝐴)))) = (𝐴𝑦))
5453adantl 482 . . . . . . . . . . . . . 14 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐴))) → if(𝑦 ∈ (0..^(#‘𝐴)), (𝐴𝑦), (𝐵‘(𝑦 − (#‘𝐴)))) = (𝐴𝑦))
5554eleq1d 2683 . . . . . . . . . . . . 13 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐴))) → (if(𝑦 ∈ (0..^(#‘𝐴)), (𝐴𝑦), (𝐵‘(𝑦 − (#‘𝐴)))) ∈ 𝑆 ↔ (𝐴𝑦) ∈ 𝑆))
5652, 55sylibd 229 . . . . . . . . . . . 12 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐴))) → (∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆 → (𝐴𝑦) ∈ 𝑆))
5756impancom 456 . . . . . . . . . . 11 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ ∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆) → (𝑦 ∈ (0..^(#‘𝐴)) → (𝐴𝑦) ∈ 𝑆))
5857imp 445 . . . . . . . . . 10 ((((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ ∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆) ∧ 𝑦 ∈ (0..^(#‘𝐴))) → (𝐴𝑦) ∈ 𝑆)
5958ralrimiva 2961 . . . . . . . . 9 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ ∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆) → ∀𝑦 ∈ (0..^(#‘𝐴))(𝐴𝑦) ∈ 𝑆)
60 iswrdsymb 13268 . . . . . . . . 9 ((𝐴 ∈ Word V ∧ ∀𝑦 ∈ (0..^(#‘𝐴))(𝐴𝑦) ∈ 𝑆) → 𝐴 ∈ Word 𝑆)
6130, 59, 60syl2an2r 875 . . . . . . . 8 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ ∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆) → 𝐴 ∈ Word 𝑆)
62 simpr 477 . . . . . . . . 9 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → 𝐵 ∈ Word V)
63 simpr 477 . . . . . . . . . . . . . . . 16 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → 𝑦 ∈ (0..^(#‘𝐵)))
6418adantr 481 . . . . . . . . . . . . . . . . 17 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → (#‘𝐴) ∈ ℕ0)
6564adantr 481 . . . . . . . . . . . . . . . 16 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → (#‘𝐴) ∈ ℕ0)
66 elincfzoext 12473 . . . . . . . . . . . . . . . 16 ((𝑦 ∈ (0..^(#‘𝐵)) ∧ (#‘𝐴) ∈ ℕ0) → (𝑦 + (#‘𝐴)) ∈ (0..^((#‘𝐵) + (#‘𝐴))))
6763, 65, 66syl2anc 692 . . . . . . . . . . . . . . 15 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → (𝑦 + (#‘𝐴)) ∈ (0..^((#‘𝐵) + (#‘𝐴))))
6818nn0cnd 11304 . . . . . . . . . . . . . . . . . . 19 (𝐴 ∈ Word V → (#‘𝐴) ∈ ℂ)
6919nn0cnd 11304 . . . . . . . . . . . . . . . . . . 19 (𝐵 ∈ Word V → (#‘𝐵) ∈ ℂ)
7068, 69, 33syl2an 494 . . . . . . . . . . . . . . . . . 18 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → ((#‘𝐴) + (#‘𝐵)) = ((#‘𝐵) + (#‘𝐴)))
7170oveq2d 6626 . . . . . . . . . . . . . . . . 17 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → (0..^((#‘𝐴) + (#‘𝐵))) = (0..^((#‘𝐵) + (#‘𝐴))))
7271eleq2d 2684 . . . . . . . . . . . . . . . 16 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → ((𝑦 + (#‘𝐴)) ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↔ (𝑦 + (#‘𝐴)) ∈ (0..^((#‘𝐵) + (#‘𝐴)))))
7372adantr 481 . . . . . . . . . . . . . . 15 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → ((𝑦 + (#‘𝐴)) ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↔ (𝑦 + (#‘𝐴)) ∈ (0..^((#‘𝐵) + (#‘𝐴)))))
7467, 73mpbird 247 . . . . . . . . . . . . . 14 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → (𝑦 + (#‘𝐴)) ∈ (0..^((#‘𝐴) + (#‘𝐵))))
75 eleq1 2686 . . . . . . . . . . . . . . . . 17 (𝑥 = (𝑦 + (#‘𝐴)) → (𝑥 ∈ (0..^(#‘𝐴)) ↔ (𝑦 + (#‘𝐴)) ∈ (0..^(#‘𝐴))))
76 fveq2 6153 . . . . . . . . . . . . . . . . 17 (𝑥 = (𝑦 + (#‘𝐴)) → (𝐴𝑥) = (𝐴‘(𝑦 + (#‘𝐴))))
77 oveq1 6617 . . . . . . . . . . . . . . . . . 18 (𝑥 = (𝑦 + (#‘𝐴)) → (𝑥 − (#‘𝐴)) = ((𝑦 + (#‘𝐴)) − (#‘𝐴)))
7877fveq2d 6157 . . . . . . . . . . . . . . . . 17 (𝑥 = (𝑦 + (#‘𝐴)) → (𝐵‘(𝑥 − (#‘𝐴))) = (𝐵‘((𝑦 + (#‘𝐴)) − (#‘𝐴))))
7975, 76, 78ifbieq12d 4090 . . . . . . . . . . . . . . . 16 (𝑥 = (𝑦 + (#‘𝐴)) → if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) = if((𝑦 + (#‘𝐴)) ∈ (0..^(#‘𝐴)), (𝐴‘(𝑦 + (#‘𝐴))), (𝐵‘((𝑦 + (#‘𝐴)) − (#‘𝐴)))))
8079eleq1d 2683 . . . . . . . . . . . . . . 15 (𝑥 = (𝑦 + (#‘𝐴)) → (if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆 ↔ if((𝑦 + (#‘𝐴)) ∈ (0..^(#‘𝐴)), (𝐴‘(𝑦 + (#‘𝐴))), (𝐵‘((𝑦 + (#‘𝐴)) − (#‘𝐴)))) ∈ 𝑆))
8180rspcv 3294 . . . . . . . . . . . . . 14 ((𝑦 + (#‘𝐴)) ∈ (0..^((#‘𝐴) + (#‘𝐵))) → (∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆 → if((𝑦 + (#‘𝐴)) ∈ (0..^(#‘𝐴)), (𝐴‘(𝑦 + (#‘𝐴))), (𝐵‘((𝑦 + (#‘𝐴)) − (#‘𝐴)))) ∈ 𝑆))
8274, 81syl 17 . . . . . . . . . . . . 13 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → (∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆 → if((𝑦 + (#‘𝐴)) ∈ (0..^(#‘𝐴)), (𝐴‘(𝑦 + (#‘𝐴))), (𝐵‘((𝑦 + (#‘𝐴)) − (#‘𝐴)))) ∈ 𝑆))
8318nn0red 11303 . . . . . . . . . . . . . . . . . . . . 21 (𝐴 ∈ Word V → (#‘𝐴) ∈ ℝ)
8483adantr 481 . . . . . . . . . . . . . . . . . . . 20 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → (#‘𝐴) ∈ ℝ)
8584adantr 481 . . . . . . . . . . . . . . . . . . 19 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → (#‘𝐴) ∈ ℝ)
86 elfzoelz 12418 . . . . . . . . . . . . . . . . . . . . . . 23 (𝑦 ∈ (0..^(#‘𝐵)) → 𝑦 ∈ ℤ)
8786zred 11433 . . . . . . . . . . . . . . . . . . . . . 22 (𝑦 ∈ (0..^(#‘𝐵)) → 𝑦 ∈ ℝ)
8887adantr 481 . . . . . . . . . . . . . . . . . . . . 21 ((𝑦 ∈ (0..^(#‘𝐵)) ∧ (𝐴 ∈ Word V ∧ 𝐵 ∈ Word V)) → 𝑦 ∈ ℝ)
8984adantl 482 . . . . . . . . . . . . . . . . . . . . 21 ((𝑦 ∈ (0..^(#‘𝐵)) ∧ (𝐴 ∈ Word V ∧ 𝐵 ∈ Word V)) → (#‘𝐴) ∈ ℝ)
9088, 89readdcld 10020 . . . . . . . . . . . . . . . . . . . 20 ((𝑦 ∈ (0..^(#‘𝐵)) ∧ (𝐴 ∈ Word V ∧ 𝐵 ∈ Word V)) → (𝑦 + (#‘𝐴)) ∈ ℝ)
9190ancoms 469 . . . . . . . . . . . . . . . . . . 19 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → (𝑦 + (#‘𝐴)) ∈ ℝ)
92 elfzole1 12426 . . . . . . . . . . . . . . . . . . . . 21 (𝑦 ∈ (0..^(#‘𝐵)) → 0 ≤ 𝑦)
9392adantl 482 . . . . . . . . . . . . . . . . . . . 20 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → 0 ≤ 𝑦)
94 addge02 10490 . . . . . . . . . . . . . . . . . . . . 21 (((#‘𝐴) ∈ ℝ ∧ 𝑦 ∈ ℝ) → (0 ≤ 𝑦 ↔ (#‘𝐴) ≤ (𝑦 + (#‘𝐴))))
9584, 87, 94syl2an 494 . . . . . . . . . . . . . . . . . . . 20 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → (0 ≤ 𝑦 ↔ (#‘𝐴) ≤ (𝑦 + (#‘𝐴))))
9693, 95mpbid 222 . . . . . . . . . . . . . . . . . . 19 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → (#‘𝐴) ≤ (𝑦 + (#‘𝐴)))
9785, 91, 96lensymd 10139 . . . . . . . . . . . . . . . . . 18 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → ¬ (𝑦 + (#‘𝐴)) < (#‘𝐴))
9897intn3an3d 1441 . . . . . . . . . . . . . . . . 17 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → ¬ ((𝑦 + (#‘𝐴)) ∈ ℕ0 ∧ (#‘𝐴) ∈ ℕ ∧ (𝑦 + (#‘𝐴)) < (#‘𝐴)))
99 elfzo0 12456 . . . . . . . . . . . . . . . . 17 ((𝑦 + (#‘𝐴)) ∈ (0..^(#‘𝐴)) ↔ ((𝑦 + (#‘𝐴)) ∈ ℕ0 ∧ (#‘𝐴) ∈ ℕ ∧ (𝑦 + (#‘𝐴)) < (#‘𝐴)))
10098, 99sylnibr 319 . . . . . . . . . . . . . . . 16 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → ¬ (𝑦 + (#‘𝐴)) ∈ (0..^(#‘𝐴)))
101100iffalsed 4074 . . . . . . . . . . . . . . 15 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → if((𝑦 + (#‘𝐴)) ∈ (0..^(#‘𝐴)), (𝐴‘(𝑦 + (#‘𝐴))), (𝐵‘((𝑦 + (#‘𝐴)) − (#‘𝐴)))) = (𝐵‘((𝑦 + (#‘𝐴)) − (#‘𝐴))))
102101eleq1d 2683 . . . . . . . . . . . . . 14 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → (if((𝑦 + (#‘𝐴)) ∈ (0..^(#‘𝐴)), (𝐴‘(𝑦 + (#‘𝐴))), (𝐵‘((𝑦 + (#‘𝐴)) − (#‘𝐴)))) ∈ 𝑆 ↔ (𝐵‘((𝑦 + (#‘𝐴)) − (#‘𝐴))) ∈ 𝑆))
10386zcnd 11434 . . . . . . . . . . . . . . . . . 18 (𝑦 ∈ (0..^(#‘𝐵)) → 𝑦 ∈ ℂ)
10468adantr 481 . . . . . . . . . . . . . . . . . 18 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → (#‘𝐴) ∈ ℂ)
105 pncan 10238 . . . . . . . . . . . . . . . . . 18 ((𝑦 ∈ ℂ ∧ (#‘𝐴) ∈ ℂ) → ((𝑦 + (#‘𝐴)) − (#‘𝐴)) = 𝑦)
106103, 104, 105syl2anr 495 . . . . . . . . . . . . . . . . 17 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → ((𝑦 + (#‘𝐴)) − (#‘𝐴)) = 𝑦)
107106fveq2d 6157 . . . . . . . . . . . . . . . 16 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → (𝐵‘((𝑦 + (#‘𝐴)) − (#‘𝐴))) = (𝐵𝑦))
108107eleq1d 2683 . . . . . . . . . . . . . . 15 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → ((𝐵‘((𝑦 + (#‘𝐴)) − (#‘𝐴))) ∈ 𝑆 ↔ (𝐵𝑦) ∈ 𝑆))
109108biimpd 219 . . . . . . . . . . . . . 14 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → ((𝐵‘((𝑦 + (#‘𝐴)) − (#‘𝐴))) ∈ 𝑆 → (𝐵𝑦) ∈ 𝑆))
110102, 109sylbid 230 . . . . . . . . . . . . 13 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → (if((𝑦 + (#‘𝐴)) ∈ (0..^(#‘𝐴)), (𝐴‘(𝑦 + (#‘𝐴))), (𝐵‘((𝑦 + (#‘𝐴)) − (#‘𝐴)))) ∈ 𝑆 → (𝐵𝑦) ∈ 𝑆))
11182, 110syld 47 . . . . . . . . . . . 12 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → (∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆 → (𝐵𝑦) ∈ 𝑆))
112111impancom 456 . . . . . . . . . . 11 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ ∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆) → (𝑦 ∈ (0..^(#‘𝐵)) → (𝐵𝑦) ∈ 𝑆))
113112imp 445 . . . . . . . . . 10 ((((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ ∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆) ∧ 𝑦 ∈ (0..^(#‘𝐵))) → (𝐵𝑦) ∈ 𝑆)
114113ralrimiva 2961 . . . . . . . . 9 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ ∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆) → ∀𝑦 ∈ (0..^(#‘𝐵))(𝐵𝑦) ∈ 𝑆)
115 iswrdsymb 13268 . . . . . . . . 9 ((𝐵 ∈ Word V ∧ ∀𝑦 ∈ (0..^(#‘𝐵))(𝐵𝑦) ∈ 𝑆) → 𝐵 ∈ Word 𝑆)
11662, 114, 115syl2an2r 875 . . . . . . . 8 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ ∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆) → 𝐵 ∈ Word 𝑆)
11761, 116jca 554 . . . . . . 7 (((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) ∧ ∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆) → (𝐴 ∈ Word 𝑆𝐵 ∈ Word 𝑆))
118117ex 450 . . . . . 6 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → (∀𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵)))if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))) ∈ 𝑆 → (𝐴 ∈ Word 𝑆𝐵 ∈ Word 𝑆)))
11929, 118syl5bir 233 . . . . 5 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → ((𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))):(0..^((#‘𝐴) + (#‘𝐵)))⟶𝑆 → (𝐴 ∈ Word 𝑆𝐵 ∈ Word 𝑆)))
12027, 119sylbid 230 . . . 4 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → ((𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))):(0..^(#‘(𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴)))))))⟶𝑆 → (𝐴 ∈ Word 𝑆𝐵 ∈ Word 𝑆)))
1213, 120syl5 34 . . 3 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → ((𝑥 ∈ (0..^((#‘𝐴) + (#‘𝐵))) ↦ if(𝑥 ∈ (0..^(#‘𝐴)), (𝐴𝑥), (𝐵‘(𝑥 − (#‘𝐴))))) ∈ Word 𝑆 → (𝐴 ∈ Word 𝑆𝐵 ∈ Word 𝑆)))
1222, 121sylbid 230 . 2 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → ((𝐴 ++ 𝐵) ∈ Word 𝑆 → (𝐴 ∈ Word 𝑆𝐵 ∈ Word 𝑆)))
123 ccatcl 13305 . 2 ((𝐴 ∈ Word 𝑆𝐵 ∈ Word 𝑆) → (𝐴 ++ 𝐵) ∈ Word 𝑆)
124122, 123impbid1 215 1 ((𝐴 ∈ Word V ∧ 𝐵 ∈ Word V) → ((𝐴 ++ 𝐵) ∈ Word 𝑆 ↔ (𝐴 ∈ Word 𝑆𝐵 ∈ Word 𝑆)))
 Colors of variables: wff setvar class Syntax hints:   → wi 4   ↔ wb 196   ∧ wa 384   ∧ w3a 1036   = wceq 1480   ∈ wcel 1987  ∀wral 2907  Vcvv 3189   ⊆ wss 3559  ifcif 4063   class class class wbr 4618   ↦ cmpt 4678  dom cdm 5079  Fun wfun 5846  ⟶wf 5848  ‘cfv 5852  (class class class)co 6610  Fincfn 7906  ℂcc 9885  ℝcr 9886  0cc0 9887   + caddc 9890   < clt 10025   ≤ cle 10026   − cmin 10217  ℕcn 10971  ℕ0cn0 11243  ℤcz 11328  ℤ≥cuz 11638  ..^cfzo 12413  #chash 13064  Word cword 13237   ++ cconcat 13239 This theorem was proved from axioms:  ax-mp 5  ax-1 6  ax-2 7  ax-3 8  ax-gen 1719  ax-4 1734  ax-5 1836  ax-6 1885  ax-7 1932  ax-8 1989  ax-9 1996  ax-10 2016  ax-11 2031  ax-12 2044  ax-13 2245  ax-ext 2601  ax-rep 4736  ax-sep 4746  ax-nul 4754  ax-pow 4808  ax-pr 4872  ax-un 6909  ax-cnex 9943  ax-resscn 9944  ax-1cn 9945  ax-icn 9946  ax-addcl 9947  ax-addrcl 9948  ax-mulcl 9949  ax-mulrcl 9950  ax-mulcom 9951  ax-addass 9952  ax-mulass 9953  ax-distr 9954  ax-i2m1 9955  ax-1ne0 9956  ax-1rid 9957  ax-rnegex 9958  ax-rrecex 9959  ax-cnre 9960  ax-pre-lttri 9961  ax-pre-lttrn 9962  ax-pre-ltadd 9963  ax-pre-mulgt0 9964 This theorem depends on definitions:  df-bi 197  df-or 385  df-an 386  df-3or 1037  df-3an 1038  df-tru 1483  df-ex 1702  df-nf 1707  df-sb 1878  df-eu 2473  df-mo 2474  df-clab 2608  df-cleq 2614  df-clel 2617  df-nfc 2750  df-ne 2791  df-nel 2894  df-ral 2912  df-rex 2913  df-reu 2914  df-rmo 2915  df-rab 2916  df-v 3191  df-sbc 3422  df-csb 3519  df-dif 3562  df-un 3564  df-in 3566  df-ss 3573  df-pss 3575  df-nul 3897  df-if 4064  df-pw 4137  df-sn 4154  df-pr 4156  df-tp 4158  df-op 4160  df-uni 4408  df-int 4446  df-iun 4492  df-br 4619  df-opab 4679  df-mpt 4680  df-tr 4718  df-eprel 4990  df-id 4994  df-po 5000  df-so 5001  df-fr 5038  df-we 5040  df-xp 5085  df-rel 5086  df-cnv 5087  df-co 5088  df-dm 5089  df-rn 5090  df-res 5091  df-ima 5092  df-pred 5644  df-ord 5690  df-on 5691  df-lim 5692  df-suc 5693  df-iota 5815  df-fun 5854  df-fn 5855  df-f 5856  df-f1 5857  df-fo 5858  df-f1o 5859  df-fv 5860  df-riota 6571  df-ov 6613  df-oprab 6614  df-mpt2 6615  df-om 7020  df-1st 7120  df-2nd 7121  df-wrecs 7359  df-recs 7420  df-rdg 7458  df-1o 7512  df-oadd 7516  df-er 7694  df-en 7907  df-dom 7908  df-sdom 7909  df-fin 7910  df-card 8716  df-cda 8941  df-pnf 10027  df-mnf 10028  df-xr 10029  df-ltxr 10030  df-le 10031  df-sub 10219  df-neg 10220  df-nn 10972  df-2 11030  df-n0 11244  df-xnn0 11315  df-z 11329  df-uz 11639  df-fz 12276  df-fzo 12414  df-hash 13065  df-word 13245  df-concat 13247 This theorem is referenced by:  ccatrcl1  13322
 Copyright terms: Public domain W3C validator