Notation no_invG :=
  (fun s : S_Ck SG =>
   match s with
   | (sg, z) =>
       sg = Lowering /\ ~ lt_Ck z kg1 \/ sg = Raising /\ ~ lt_Ck z kg3
   end) (only parsing).

(* Specifications: *)
Lemma No_invG : forall s : S_Ck SG, ~ InvG s -> (fun s : S_Ck SG => match s with | (sg, z) => sg = Lowering /\ ~ lt_Ck z kg1 \/ sg = Raising /\ ~ lt_Ck z kg3 end) s.
Lemma INV_TCG_general : forall s : StGlobal, (fun s : StGlobal => match s with | (st_x, (sc_y, sg_z)) => InvT st_x /\ InvC sc_y /\ InvG sg_z end) s -> ForAll TrGlobal s (fun s : StGlobal => match s with | (st_x, (sc_y, sg_z)) => InvT st_x /\ InvC sc_y /\ InvG sg_z end).
Lemma INV_T_general : forall s1 s2 : StGlobal, (fun s : StGlobal => match s with | (st_x, (sc_y, sg_z)) => InvT st_x /\ InvC sc_y /\ InvG sg_z end) s1 -> RState TrGlobal s1 s2 -> InvT (fst s2).
Lemma INV_C_general : forall s1 s2 : StGlobal, (fun s : StGlobal => match s with | (st_x, (sc_y, sg_z)) => InvT st_x /\ InvC sc_y /\ InvG sg_z end) s1 -> RState TrGlobal s1 s2 -> InvC (fst (snd s2)).
Lemma INV_G_general : forall s1 s2 : StGlobal, (fun s : StGlobal => match s with | (st_x, (sc_y, sg_z)) => InvT st_x /\ InvC sc_y /\ InvG sg_z end) s1 -> RState TrGlobal s1 s2 -> InvG (snd (snd s2)).