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

Theorem orbsta 19414
Description: The Orbit-Stabilizer theorem. The mapping 𝐹 is a bijection from the cosets of the stabilizer subgroup of 𝐴 to the orbit of 𝐴. (Contributed by Mario Carneiro, 15-Jan-2015.)
Hypotheses
Ref Expression
gasta.1 𝑋 = (Base‘𝐺)
gasta.2 𝐻 = {𝑢𝑋 ∣ (𝑢 𝐴) = 𝐴}
orbsta.r = (𝐺 ~QG 𝐻)
orbsta.f 𝐹 = ran (𝑘𝑋 ↦ ⟨[𝑘] , (𝑘 𝐴)⟩)
orbsta.o 𝑂 = {⟨𝑥, 𝑦⟩ ∣ ({𝑥, 𝑦} ⊆ 𝑌 ∧ ∃𝑔𝑋 (𝑔 𝑥) = 𝑦)}
Assertion
Ref Expression
orbsta (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → 𝐹:(𝑋 / )–1-1-onto→[𝐴]𝑂)
Distinct variable groups:   𝑔,𝑘,𝑥,𝑦,   𝑢,𝑔, ,𝑘,𝑥,𝑦   𝑥,𝐻,𝑦   𝐴,𝑔,𝑘,𝑢,𝑥,𝑦   𝑔,𝐺,𝑘,𝑢,𝑥,𝑦   𝑔,𝑋,𝑘,𝑢,𝑥,𝑦   𝑘,𝑂   𝑔,𝑌,𝑘,𝑥,𝑦
Allowed substitution hints:   (𝑢)   𝐹(𝑥, 𝑦, 𝑢, 𝑔, 𝑘)   𝐻(𝑢, 𝑔, 𝑘)   𝑂(𝑥, 𝑦, 𝑢, 𝑔)   𝑌(𝑢)

Proof of Theorem orbsta
Dummy variables 𝑎 𝑏 𝑤 𝑧 are mutually distinct and distinct from all other variables.
StepHypRef Expression
1 gasta.1 . . . . 5 𝑋 = (Base‘𝐺)
2 gasta.2 . . . . 5 𝐻 = {𝑢𝑋 ∣ (𝑢 𝐴) = 𝐴}
3 orbsta.r . . . . 5 = (𝐺 ~QG 𝐻)
4 orbsta.f . . . . 5 𝐹 = ran (𝑘𝑋 ↦ ⟨[𝑘] , (𝑘 𝐴)⟩)
51, 2, 3, 4orbstafun 19412 . . . 4 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → Fun 𝐹)
6 simpr 490 . . . . . . . 8 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → 𝐴𝑌)
76adantr 486 . . . . . . 7 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑘𝑋) → 𝐴𝑌)
81gaf 19396 . . . . . . . . . 10 ( ∈ (𝐺 GrpAct 𝑌) → :(𝑋 × 𝑌)⟶𝑌)
98adantr 486 . . . . . . . . 9 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → :(𝑋 × 𝑌)⟶𝑌)
109adantr 486 . . . . . . . 8 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑘𝑋) → :(𝑋 × 𝑌)⟶𝑌)
11 simpr 490 . . . . . . . 8 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑘𝑋) → 𝑘𝑋)
1210, 11, 7fovcdmd 7595 . . . . . . 7 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑘𝑋) → (𝑘 𝐴) ∈ 𝑌)
13 eqid 2766 . . . . . . . 8 (𝑘 𝐴) = (𝑘 𝐴)
14 oveq1 7430 . . . . . . . . . 10 ( = 𝑘 → ( 𝐴) = (𝑘 𝐴))
1514eqeq1d 2768 . . . . . . . . 9 ( = 𝑘 → (( 𝐴) = (𝑘 𝐴) ↔ (𝑘 𝐴) = (𝑘 𝐴)))
1615rspcev 3584 . . . . . . . 8 ((𝑘𝑋 ∧ (𝑘 𝐴) = (𝑘 𝐴)) → ∃𝑋 ( 𝐴) = (𝑘 𝐴))
1711, 13, 16sylancl 598 . . . . . . 7 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑘𝑋) → ∃𝑋 ( 𝐴) = (𝑘 𝐴))
18 orbsta.o . . . . . . . 8 𝑂 = {⟨𝑥, 𝑦⟩ ∣ ({𝑥, 𝑦} ⊆ 𝑌 ∧ ∃𝑔𝑋 (𝑔 𝑥) = 𝑦)}
1918gaorb 19408 . . . . . . 7 (𝐴𝑂(𝑘 𝐴) ↔ (𝐴𝑌 ∧ (𝑘 𝐴) ∈ 𝑌 ∧ ∃𝑋 ( 𝐴) = (𝑘 𝐴)))
207, 12, 17, 19syl3anbrc 1362 . . . . . 6 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑘𝑋) → 𝐴𝑂(𝑘 𝐴))
21 ovex 7456 . . . . . . 7 (𝑘 𝐴) ∈ V
22 elecg 8748 . . . . . . 7 (((𝑘 𝐴) ∈ V ∧ 𝐴𝑌) → ((𝑘 𝐴) ∈ [𝐴]𝑂𝐴𝑂(𝑘 𝐴)))
2321, 7, 22sylancr 599 . . . . . 6 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑘𝑋) → ((𝑘 𝐴) ∈ [𝐴]𝑂𝐴𝑂(𝑘 𝐴)))
2420, 23mpbird 260 . . . . 5 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑘𝑋) → (𝑘 𝐴) ∈ [𝐴]𝑂)
251, 2gastacl 19410 . . . . . 6 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → 𝐻 ∈ (SubGrp‘𝐺))
261, 3eqger 19277 . . . . . 6 (𝐻 ∈ (SubGrp‘𝐺) → Er 𝑋)
2725, 26syl 18 . . . . 5 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → Er 𝑋)
281fvexi 6902 . . . . . 6 𝑋 ∈ V
2928a1i 11 . . . . 5 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → 𝑋 ∈ V)
304, 24, 27, 29qliftf 8812 . . . 4 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → (Fun 𝐹𝐹:(𝑋 / )⟶[𝐴]𝑂))
315, 30mpbid 235 . . 3 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → 𝐹:(𝑋 / )⟶[𝐴]𝑂)
32 eqid 2766 . . . . 5 (𝑋 / ) = (𝑋 / )
33 fveqeq2 6897 . . . . . . 7 ([𝑧] = 𝑎 → ((𝐹‘[𝑧] ) = (𝐹𝑏) ↔ (𝐹𝑎) = (𝐹𝑏)))
34 eqeq1 2770 . . . . . . 7 ([𝑧] = 𝑎 → ([𝑧] = 𝑏𝑎 = 𝑏))
3533, 34imbi12d 347 . . . . . 6 ([𝑧] = 𝑎 → (((𝐹‘[𝑧] ) = (𝐹𝑏) → [𝑧] = 𝑏) ↔ ((𝐹𝑎) = (𝐹𝑏) → 𝑎 = 𝑏)))
3635ralbidv 3191 . . . . 5 ([𝑧] = 𝑎 → (∀𝑏 ∈ (𝑋 / )((𝐹‘[𝑧] ) = (𝐹𝑏) → [𝑧] = 𝑏) ↔ ∀𝑏 ∈ (𝑋 / )((𝐹𝑎) = (𝐹𝑏) → 𝑎 = 𝑏)))
37 fveq2 6888 . . . . . . . . 9 ([𝑤] = 𝑏 → (𝐹‘[𝑤] ) = (𝐹𝑏))
3837eqeq2d 2777 . . . . . . . 8 ([𝑤] = 𝑏 → ((𝐹‘[𝑧] ) = (𝐹‘[𝑤] ) ↔ (𝐹‘[𝑧] ) = (𝐹𝑏)))
39 eqeq2 2778 . . . . . . . 8 ([𝑤] = 𝑏 → ([𝑧] = [𝑤] ↔ [𝑧] = 𝑏))
4038, 39imbi12d 347 . . . . . . 7 ([𝑤] = 𝑏 → (((𝐹‘[𝑧] ) = (𝐹‘[𝑤] ) → [𝑧] = [𝑤] ) ↔ ((𝐹‘[𝑧] ) = (𝐹𝑏) → [𝑧] = 𝑏)))
411, 2, 3, 4orbstaval 19413 . . . . . . . . . . . 12 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑧𝑋) → (𝐹‘[𝑧] ) = (𝑧 𝐴))
4241adantrr 730 . . . . . . . . . . 11 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ (𝑧𝑋𝑤𝑋)) → (𝐹‘[𝑧] ) = (𝑧 𝐴))
431, 2, 3, 4orbstaval 19413 . . . . . . . . . . . 12 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑤𝑋) → (𝐹‘[𝑤] ) = (𝑤 𝐴))
4443adantrl 729 . . . . . . . . . . 11 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ (𝑧𝑋𝑤𝑋)) → (𝐹‘[𝑤] ) = (𝑤 𝐴))
4542, 44eqeq12d 2782 . . . . . . . . . 10 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ (𝑧𝑋𝑤𝑋)) → ((𝐹‘[𝑧] ) = (𝐹‘[𝑤] ) ↔ (𝑧 𝐴) = (𝑤 𝐴)))
461, 2, 3gastacos 19411 . . . . . . . . . 10 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ (𝑧𝑋𝑤𝑋)) → (𝑧 𝑤 ↔ (𝑧 𝐴) = (𝑤 𝐴)))
4727adantr 486 . . . . . . . . . . 11 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ (𝑧𝑋𝑤𝑋)) → Er 𝑋)
48 simprl 783 . . . . . . . . . . 11 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ (𝑧𝑋𝑤𝑋)) → 𝑧𝑋)
4947, 48erth 8758 . . . . . . . . . 10 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ (𝑧𝑋𝑤𝑋)) → (𝑧 𝑤 ↔ [𝑧] = [𝑤] ))
5045, 46, 493bitr2d 310 . . . . . . . . 9 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ (𝑧𝑋𝑤𝑋)) → ((𝐹‘[𝑧] ) = (𝐹‘[𝑤] ) ↔ [𝑧] = [𝑤] ))
5150biimpd 232 . . . . . . . 8 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ (𝑧𝑋𝑤𝑋)) → ((𝐹‘[𝑧] ) = (𝐹‘[𝑤] ) → [𝑧] = [𝑤] ))
5251anassrs 473 . . . . . . 7 (((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑧𝑋) ∧ 𝑤𝑋) → ((𝐹‘[𝑧] ) = (𝐹‘[𝑤] ) → [𝑧] = [𝑤] ))
5332, 40, 52ectocld 8789 . . . . . 6 (((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑧𝑋) ∧ 𝑏 ∈ (𝑋 / )) → ((𝐹‘[𝑧] ) = (𝐹𝑏) → [𝑧] = 𝑏))
5453ralrimiva 3160 . . . . 5 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑧𝑋) → ∀𝑏 ∈ (𝑋 / )((𝐹‘[𝑧] ) = (𝐹𝑏) → [𝑧] = 𝑏))
5532, 36, 54ectocld 8789 . . . 4 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑎 ∈ (𝑋 / )) → ∀𝑏 ∈ (𝑋 / )((𝐹𝑎) = (𝐹𝑏) → 𝑎 = 𝑏))
5655ralrimiva 3160 . . 3 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → ∀𝑎 ∈ (𝑋 / )∀𝑏 ∈ (𝑋 / )((𝐹𝑎) = (𝐹𝑏) → 𝑎 = 𝑏))
57 dff13 7259 . . 3 (𝐹:(𝑋 / )–1-1→[𝐴]𝑂 ↔ (𝐹:(𝑋 / )⟶[𝐴]𝑂 ∧ ∀𝑎 ∈ (𝑋 / )∀𝑏 ∈ (𝑋 / )((𝐹𝑎) = (𝐹𝑏) → 𝑎 = 𝑏)))
5831, 56, 57sylanbrc 595 . 2 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → 𝐹:(𝑋 / )–1-1→[𝐴]𝑂)
59 vex 3462 . . . . . . . . 9 ∈ V
60 elecg 8748 . . . . . . . . 9 (( ∈ V ∧ 𝐴𝑌) → ( ∈ [𝐴]𝑂𝐴𝑂))
6159, 6, 60sylancr 599 . . . . . . . 8 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → ( ∈ [𝐴]𝑂𝐴𝑂))
6218gaorb 19408 . . . . . . . 8 (𝐴𝑂 ↔ (𝐴𝑌𝑌 ∧ ∃𝑤𝑋 (𝑤 𝐴) = ))
6361, 62bitrdi 290 . . . . . . 7 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → ( ∈ [𝐴]𝑂 ↔ (𝐴𝑌𝑌 ∧ ∃𝑤𝑋 (𝑤 𝐴) = )))
6463biimpa 482 . . . . . 6 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ ∈ [𝐴]𝑂) → (𝐴𝑌𝑌 ∧ ∃𝑤𝑋 (𝑤 𝐴) = ))
6564simp3d 1162 . . . . 5 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ ∈ [𝐴]𝑂) → ∃𝑤𝑋 (𝑤 𝐴) = )
663ovexi 7457 . . . . . . . . . 10 ∈ V
6766ecelqsi 8776 . . . . . . . . 9 (𝑤𝑋 → [𝑤] ∈ (𝑋 / ))
6843eqcomd 2772 . . . . . . . . 9 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑤𝑋) → (𝑤 𝐴) = (𝐹‘[𝑤] ))
69 fveq2 6888 . . . . . . . . . 10 (𝑧 = [𝑤] → (𝐹𝑧) = (𝐹‘[𝑤] ))
7069rspceeqv 3607 . . . . . . . . 9 (([𝑤] ∈ (𝑋 / ) ∧ (𝑤 𝐴) = (𝐹‘[𝑤] )) → ∃𝑧 ∈ (𝑋 / )(𝑤 𝐴) = (𝐹𝑧))
7167, 68, 70syl2an2 699 . . . . . . . 8 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑤𝑋) → ∃𝑧 ∈ (𝑋 / )(𝑤 𝐴) = (𝐹𝑧))
72 eqeq1 2770 . . . . . . . . 9 ((𝑤 𝐴) = → ((𝑤 𝐴) = (𝐹𝑧) ↔ = (𝐹𝑧)))
7372rexbidv 3192 . . . . . . . 8 ((𝑤 𝐴) = → (∃𝑧 ∈ (𝑋 / )(𝑤 𝐴) = (𝐹𝑧) ↔ ∃𝑧 ∈ (𝑋 / ) = (𝐹𝑧)))
7471, 73syl5ibcom 248 . . . . . . 7 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ 𝑤𝑋) → ((𝑤 𝐴) = → ∃𝑧 ∈ (𝑋 / ) = (𝐹𝑧)))
7574rexlimdva 3169 . . . . . 6 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → (∃𝑤𝑋 (𝑤 𝐴) = → ∃𝑧 ∈ (𝑋 / ) = (𝐹𝑧)))
7675imp 412 . . . . 5 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ ∃𝑤𝑋 (𝑤 𝐴) = ) → ∃𝑧 ∈ (𝑋 / ) = (𝐹𝑧))
7765, 76syldan 603 . . . 4 ((( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) ∧ ∈ [𝐴]𝑂) → ∃𝑧 ∈ (𝑋 / ) = (𝐹𝑧))
7877ralrimiva 3160 . . 3 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → ∀ ∈ [ 𝐴]𝑂𝑧 ∈ (𝑋 / ) = (𝐹𝑧))
79 dffo3 7104 . . 3 (𝐹:(𝑋 / )–onto→[𝐴]𝑂 ↔ (𝐹:(𝑋 / )⟶[𝐴]𝑂 ∧ ∀ ∈ [ 𝐴]𝑂𝑧 ∈ (𝑋 / ) = (𝐹𝑧)))
8031, 78, 79sylanbrc 595 . 2 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → 𝐹:(𝑋 / )–onto→[𝐴]𝑂)
81 df-f1o 6550 . 2 (𝐹:(𝑋 / )–1-1-onto→[𝐴]𝑂 ↔ (𝐹:(𝑋 / )–1-1→[𝐴]𝑂𝐹:(𝑋 / )–onto→[𝐴]𝑂))
8258, 80, 81sylanbrc 595 1 (( ∈ (𝐺 GrpAct 𝑌) ∧ 𝐴𝑌) → 𝐹:(𝑋 / )–1-1-onto→[𝐴]𝑂)
Colors of variables:    wff setvar class
This proof depends on syntax axioms:  wi 4  wb 209  wa 401  w3a 1103   = wceq 1570  wcel 2146  wral 3082  wrex 3092  {crab 3419  Vcvv 3458  wss 3908  {cpr 4596  cop 4600   class class class wbr 5114  {copab 5178  cmpt 5197   × cxp 5664  ran crn 5667  Fun wfun 6537  wf 6539  1-1wf1 6540  ontowfo 6541  1-1-ontowf1o 6542  cfv 6543  (class class class)co 7423   Er wer 8700  [cec 8701   / cqs 8702  Basecbs 17294  SubGrpcsubg 19217   ~QG cqg 19219   GrpAct cga 19390
This proof depends on axioms:  ax-mp 5  ax-1 6  ax-2 7  ax-3 8  ax-gen 1828  ax-4 1842  ax-5 1943  ax-6 2000  ax-7 2041  ax-8 2148  ax-9 2156  ax-10 2179  ax-11 2195  ax-12 2216  ax-ext 2738  ax-sep 5262  ax-nul 5274  ax-pow 5341  ax-pr 5409  ax-un 7745  ax-cnex 11174  ax-resscn 11175  ax-1cn 11176  ax-icn 11177  ax-addcl 11178  ax-addrcl 11179  ax-mulcl 11180  ax-mulrcl 11181  ax-mulcom 11182  ax-addass 11183  ax-mulass 11184  ax-distr 11185  ax-i2m1 11186  ax-1ne0 11187  ax-1rid 11188  ax-rnegex 11189  ax-rrecex 11190  ax-cnre 11191  ax-pre-lttri 11192  ax-pre-lttrn 11193  ax-pre-ltadd 11194  ax-pre-mulgt0 11195
This proof depends on definitions:  df-bi 210  df-an 402  df-or 862  df-3or 1104  df-3an 1105  df-tru 1573  df-fal 1583  df-ex 1813  df-nf 1817  df-sb 2100  df-mo 2570  df-eu 2600  df-clab 2745  df-cleq 2758  df-clel 2841  df-nfc 2915  df-ne 2962  df-nel 3068  df-ral 3083  df-rex 3093  df-rmo 3372  df-reu 3373  df-rab 3420  df-v 3460  df-sbc 3748  df-csb 3857  df-dif 3911  df-un 3913  df-in 3915  df-ss 3925  df-pss 3928  df-nul 4290  df-if 4493  df-pw 4569  df-sn 4595  df-pr 4597  df-op 4601  df-uni 4878  df-iun 4963  df-br 5115  df-opab 5179  df-mpt 5198  df-tr 5224  df-id 5561  df-eprel 5566  df-po 5574  df-so 5575  df-fr 5619  df-we 5621  df-xp 5672  df-rel 5673  df-cnv 5674  df-co 5675  df-dm 5676  df-rn 5677  df-res 5678  df-ima 5679  df-pred 6309  df-ord 6370  df-on 6371  df-lim 6372  df-suc 6373  df-iota 6499  df-fun 6545  df-fn 6546  df-f 6547  df-f1 6548  df-fo 6549  df-f1o 6550  df-fv 6551  df-riota 7380  df-ov 7426  df-oprab 7427  df-mpo 7428  df-om 7872  df-1st 7995  df-2nd 7996  df-frecs 8287  df-wrecs 8318  df-recs 8367  df-rdg 8406  df-er 8703  df-ec 8705  df-qs 8709  df-map 8835  df-en 8953  df-dom 8954  df-sdom 8955  df-pnf 11263  df-mnf 11264  df-xr 11265  df-ltxr 11266  df-le 11267  df-sub 11461  df-neg 11462  df-nn 12252  df-2 12321  df-sets 17249  df-slot 17267  df-ndx 17279  df-base 17295  df-ress 17316  df-plusg 17348  df-0g 17519  df-mgm 18723  df-sgrp 18806  df-mnd 18822  df-grp 19034  df-minusg 19035  df-subg 19220  df-eqg 19222  df-ga 19391
This theorem is used by:  orbsta2  19415
  Copyright terms: Public domain W3C validator