Inductive FaG : Type :=
  | Var : V -> FaG
  | Law : FaG -> FaG -> FaG
  | Unit : FaG
  | Inv : FaG -> FaG.Inductive FaG : Type :=
  | Var : V -> FaG
  | Law : FaG -> FaG -> FaG
  | Unit : FaG
  | Inv : FaG -> FaG.Inductive FaG : Type :=
  | Var : V -> FaG
  | Law : FaG -> FaG -> FaG
  | Unit : FaG
  | Inv : FaG -> FaG.Inductive FaG : Type :=
  | Var : V -> FaG
  | Law : FaG -> FaG -> FaG
  | Unit : FaG
  | Inv : FaG -> FaG.Inductive FaG : Type :=
  | Var : V -> FaG
  | Law : FaG -> FaG -> FaG
  | Unit : FaG
  | Inv : FaG -> FaG.Inductive eqFaG : FaG -> FaG -> Prop :=
  | eqFaG_Var : forall x y : V, Equal x y -> (eqFaG (Var x) (Var y):Prop)
  | eqFaG_law :
      forall x x' y y' : FaG,
      eqFaG x x' -> eqFaG y y' -> (eqFaG (Law x y) (Law x' y'):Prop)
  | eqFaG_law_assoc :
      forall x y z : FaG, eqFaG (Law (Law x y) z) (Law x (Law y z)):Prop
  | eqFaG_law0r : forall x : FaG, eqFaG (Law x Unit) x:Prop
  | eqFaG_inv : forall x y : FaG, eqFaG x y -> eqFaG (Inv x) (Inv y)
  | eqFaG_invr : forall x : FaG, eqFaG (Law x (Inv x)) Unit
  | eqFaG_refl : forall x : FaG, eqFaG x x:Prop
  | eqFaG_sym : forall x y : FaG, eqFaG x y -> (eqFaG y x:Prop)
  | eqFaG_trans :
      forall x y z : FaG, eqFaG x y -> eqFaG y z -> (eqFaG x z:Prop)
  | eqFaG_com : forall x y : FaG, eqFaG (Law x y) (Law y x).Inductive eqFaG : FaG -> FaG -> Prop :=
  | eqFaG_Var : forall x y : V, Equal x y -> (eqFaG (Var x) (Var y):Prop)
  | eqFaG_law :
      forall x x' y y' : FaG,
      eqFaG x x' -> eqFaG y y' -> (eqFaG (Law x y) (Law x' y'):Prop)
  | eqFaG_law_assoc :
      forall x y z : FaG, eqFaG (Law (Law x y) z) (Law x (Law y z)):Prop
  | eqFaG_law0r : forall x : FaG, eqFaG (Law x Unit) x:Prop
  | eqFaG_inv : forall x y : FaG, eqFaG x y -> eqFaG (Inv x) (Inv y)
  | eqFaG_invr : forall x : FaG, eqFaG (Law x (Inv x)) Unit
  | eqFaG_refl : forall x : FaG, eqFaG x x:Prop
  | eqFaG_sym : forall x y : FaG, eqFaG x y -> (eqFaG y x:Prop)
  | eqFaG_trans :
      forall x y z : FaG, eqFaG x y -> eqFaG y z -> (eqFaG x z:Prop)
  | eqFaG_com : forall x y : FaG, eqFaG (Law x y) (Law y x).Inductive eqFaG : FaG -> FaG -> Prop :=
  | eqFaG_Var : forall x y : V, Equal x y -> (eqFaG (Var x) (Var y):Prop)
  | eqFaG_law :
      forall x x' y y' : FaG,
      eqFaG x x' -> eqFaG y y' -> (eqFaG (Law x y) (Law x' y'):Prop)
  | eqFaG_law_assoc :
      forall x y z : FaG, eqFaG (Law (Law x y) z) (Law x (Law y z)):Prop
  | eqFaG_law0r : forall x : FaG, eqFaG (Law x Unit) x:Prop
  | eqFaG_inv : forall x y : FaG, eqFaG x y -> eqFaG (Inv x) (Inv y)
  | eqFaG_invr : forall x : FaG, eqFaG (Law x (Inv x)) Unit
  | eqFaG_refl : forall x : FaG, eqFaG x x:Prop
  | eqFaG_sym : forall x y : FaG, eqFaG x y -> (eqFaG y x:Prop)
  | eqFaG_trans :
      forall x y z : FaG, eqFaG x y -> eqFaG y z -> (eqFaG x z:Prop)
  | eqFaG_com : forall x y : FaG, eqFaG (Law x y) (Law y x).Inductive eqFaG : FaG -> FaG -> Prop :=
  | eqFaG_Var : forall x y : V, Equal x y -> (eqFaG (Var x) (Var y):Prop)
  | eqFaG_law :
      forall x x' y y' : FaG,
      eqFaG x x' -> eqFaG y y' -> (eqFaG (Law x y) (Law x' y'):Prop)
  | eqFaG_law_assoc :
      forall x y z : FaG, eqFaG (Law (Law x y) z) (Law x (Law y z)):Prop
  | eqFaG_law0r : forall x : FaG, eqFaG (Law x Unit) x:Prop
  | eqFaG_inv : forall x y : FaG, eqFaG x y -> eqFaG (Inv x) (Inv y)
  | eqFaG_invr : forall x : FaG, eqFaG (Law x (Inv x)) Unit
  | eqFaG_refl : forall x : FaG, eqFaG x x:Prop
  | eqFaG_sym : forall x y : FaG, eqFaG x y -> (eqFaG y x:Prop)
  | eqFaG_trans :
      forall x y z : FaG, eqFaG x y -> eqFaG y z -> (eqFaG x z:Prop)
  | eqFaG_com : forall x y : FaG, eqFaG (Law x y) (Law y x).Inductive eqFaG : FaG -> FaG -> Prop :=
  | eqFaG_Var : forall x y : V, Equal x y -> (eqFaG (Var x) (Var y):Prop)
  | eqFaG_law :
      forall x x' y y' : FaG,
      eqFaG x x' -> eqFaG y y' -> (eqFaG (Law x y) (Law x' y'):Prop)
  | eqFaG_law_assoc :
      forall x y z : FaG, eqFaG (Law (Law x y) z) (Law x (Law y z)):Prop
  | eqFaG_law0r : forall x : FaG, eqFaG (Law x Unit) x:Prop
  | eqFaG_inv : forall x y : FaG, eqFaG x y -> eqFaG (Inv x) (Inv y)
  | eqFaG_invr : forall x : FaG, eqFaG (Law x (Inv x)) Unit
  | eqFaG_refl : forall x : FaG, eqFaG x x:Prop
  | eqFaG_sym : forall x y : FaG, eqFaG x y -> (eqFaG y x:Prop)
  | eqFaG_trans :
      forall x y z : FaG, eqFaG x y -> eqFaG y z -> (eqFaG x z:Prop)
  | eqFaG_com : forall x y : FaG, eqFaG (Law x y) (Law y x).Inductive eqFaG : FaG -> FaG -> Prop :=
  | eqFaG_Var : forall x y : V, Equal x y -> (eqFaG (Var x) (Var y):Prop)
  | eqFaG_law :
      forall x x' y y' : FaG,
      eqFaG x x' -> eqFaG y y' -> (eqFaG (Law x y) (Law x' y'):Prop)
  | eqFaG_law_assoc :
      forall x y z : FaG, eqFaG (Law (Law x y) z) (Law x (Law y z)):Prop
  | eqFaG_law0r : forall x : FaG, eqFaG (Law x Unit) x:Prop
  | eqFaG_inv : forall x y : FaG, eqFaG x y -> eqFaG (Inv x) (Inv y)
  | eqFaG_invr : forall x : FaG, eqFaG (Law x (Inv x)) Unit
  | eqFaG_refl : forall x : FaG, eqFaG x x:Prop
  | eqFaG_sym : forall x y : FaG, eqFaG x y -> (eqFaG y x:Prop)
  | eqFaG_trans :
      forall x y z : FaG, eqFaG x y -> eqFaG y z -> (eqFaG x z:Prop)
  | eqFaG_com : forall x y : FaG, eqFaG (Law x y) (Law y x).Inductive eqFaG : FaG -> FaG -> Prop :=
  | eqFaG_Var : forall x y : V, Equal x y -> (eqFaG (Var x) (Var y):Prop)
  | eqFaG_law :
      forall x x' y y' : FaG,
      eqFaG x x' -> eqFaG y y' -> (eqFaG (Law x y) (Law x' y'):Prop)
  | eqFaG_law_assoc :
      forall x y z : FaG, eqFaG (Law (Law x y) z) (Law x (Law y z)):Prop
  | eqFaG_law0r : forall x : FaG, eqFaG (Law x Unit) x:Prop
  | eqFaG_inv : forall x y : FaG, eqFaG x y -> eqFaG (Inv x) (Inv y)
  | eqFaG_invr : forall x : FaG, eqFaG (Law x (Inv x)) Unit
  | eqFaG_refl : forall x : FaG, eqFaG x x:Prop
  | eqFaG_sym : forall x y : FaG, eqFaG x y -> (eqFaG y x:Prop)
  | eqFaG_trans :
      forall x y z : FaG, eqFaG x y -> eqFaG y z -> (eqFaG x z:Prop)
  | eqFaG_com : forall x y : FaG, eqFaG (Law x y) (Law y x).Inductive eqFaG : FaG -> FaG -> Prop :=
  | eqFaG_Var : forall x y : V, Equal x y -> (eqFaG (Var x) (Var y):Prop)
  | eqFaG_law :
      forall x x' y y' : FaG,
      eqFaG x x' -> eqFaG y y' -> (eqFaG (Law x y) (Law x' y'):Prop)
  | eqFaG_law_assoc :
      forall x y z : FaG, eqFaG (Law (Law x y) z) (Law x (Law y z)):Prop
  | eqFaG_law0r : forall x : FaG, eqFaG (Law x Unit) x:Prop
  | eqFaG_inv : forall x y : FaG, eqFaG x y -> eqFaG (Inv x) (Inv y)
  | eqFaG_invr : forall x : FaG, eqFaG (Law x (Inv x)) Unit
  | eqFaG_refl : forall x : FaG, eqFaG x x:Prop
  | eqFaG_sym : forall x y : FaG, eqFaG x y -> (eqFaG y x:Prop)
  | eqFaG_trans :
      forall x y z : FaG, eqFaG x y -> eqFaG y z -> (eqFaG x z:Prop)
  | eqFaG_com : forall x y : FaG, eqFaG (Law x y) (Law y x).Inductive eqFaG : FaG -> FaG -> Prop :=
  | eqFaG_Var : forall x y : V, Equal x y -> (eqFaG (Var x) (Var y):Prop)
  | eqFaG_law :
      forall x x' y y' : FaG,
      eqFaG x x' -> eqFaG y y' -> (eqFaG (Law x y) (Law x' y'):Prop)
  | eqFaG_law_assoc :
      forall x y z : FaG, eqFaG (Law (Law x y) z) (Law x (Law y z)):Prop
  | eqFaG_law0r : forall x : FaG, eqFaG (Law x Unit) x:Prop
  | eqFaG_inv : forall x y : FaG, eqFaG x y -> eqFaG (Inv x) (Inv y)
  | eqFaG_invr : forall x : FaG, eqFaG (Law x (Inv x)) Unit
  | eqFaG_refl : forall x : FaG, eqFaG x x:Prop
  | eqFaG_sym : forall x y : FaG, eqFaG x y -> (eqFaG y x:Prop)
  | eqFaG_trans :
      forall x y z : FaG, eqFaG x y -> eqFaG y z -> (eqFaG x z:Prop)
  | eqFaG_com : forall x y : FaG, eqFaG (Law x y) (Law y x).Inductive eqFaG : FaG -> FaG -> Prop :=
  | eqFaG_Var : forall x y : V, Equal x y -> (eqFaG (Var x) (Var y):Prop)
  | eqFaG_law :
      forall x x' y y' : FaG,
      eqFaG x x' -> eqFaG y y' -> (eqFaG (Law x y) (Law x' y'):Prop)
  | eqFaG_law_assoc :
      forall x y z : FaG, eqFaG (Law (Law x y) z) (Law x (Law y z)):Prop
  | eqFaG_law0r : forall x : FaG, eqFaG (Law x Unit) x:Prop
  | eqFaG_inv : forall x y : FaG, eqFaG x y -> eqFaG (Inv x) (Inv y)
  | eqFaG_invr : forall x : FaG, eqFaG (Law x (Inv x)) Unit
  | eqFaG_refl : forall x : FaG, eqFaG x x:Prop
  | eqFaG_sym : forall x y : FaG, eqFaG x y -> (eqFaG y x:Prop)
  | eqFaG_trans :
      forall x y z : FaG, eqFaG x y -> eqFaG y z -> (eqFaG x z:Prop)
  | eqFaG_com : forall x y : FaG, eqFaG (Law x y) (Law y x).Inductive eqFaG : FaG -> FaG -> Prop :=
  | eqFaG_Var : forall x y : V, Equal x y -> (eqFaG (Var x) (Var y):Prop)
  | eqFaG_law :
      forall x x' y y' : FaG,
      eqFaG x x' -> eqFaG y y' -> (eqFaG (Law x y) (Law x' y'):Prop)
  | eqFaG_law_assoc :
      forall x y z : FaG, eqFaG (Law (Law x y) z) (Law x (Law y z)):Prop
  | eqFaG_law0r : forall x : FaG, eqFaG (Law x Unit) x:Prop
  | eqFaG_inv : forall x y : FaG, eqFaG x y -> eqFaG (Inv x) (Inv y)
  | eqFaG_invr : forall x : FaG, eqFaG (Law x (Inv x)) Unit
  | eqFaG_refl : forall x : FaG, eqFaG x x:Prop
  | eqFaG_sym : forall x y : FaG, eqFaG x y -> (eqFaG y x:Prop)
  | eqFaG_trans :
      forall x y z : FaG, eqFaG x y -> eqFaG y z -> (eqFaG x z:Prop)
  | eqFaG_com : forall x y : FaG, eqFaG (Law x y) (Law y x).

(* Specifications: *)
Lemma eqFaG_Equiv : equivalence eqFaG.