(* Declaration of morphisms *)
Notation PiMorph pi_x := (EqualTo pi_x).Notation PiMorph1 pi_f :=
  (fun a (x : {pi a}) => EqualTo (pi_morph1 pi_f a x)).Notation PiMorph2 pi_g :=
  (fun a b (x : {pi a}) (y : {pi b}) => EqualTo (pi_morph2 pi_g a b x y)).Notation PiMono1 pi_p :=
  (fun a (x : {pi a}) => EqualTo (pi_mono1 pi_p a x)).Notation PiMono2 pi_r :=
  (fun a b (x : {pi a}) (y : {pi b}) => EqualTo (pi_mono2 pi_r a b x y)).Notation PiMorph11 pi_f :=
  (fun a (x : {pi a}) => EqualTo (pi_morph11 pi_f a x)).(* lifiting helpers *)
Notation lift_op1 Q f := (locked (fun x : Q => \pi_Q (f (repr x)) : Q)).Notation lift_op2 Q g := 
  (locked (fun x y : Q => \pi_Q (g (repr x) (repr y)) : Q)).Notation lift_fun1 Q f := (locked (fun x : Q => f (repr x))).Notation lift_fun2 Q g := (locked (fun x y : Q => g (repr x) (repr y))).Notation lift_op11 Q Q' f := (locked (fun x : Q => \pi_Q' (f (repr x)) : Q')).(* constant declaration *)
Notation lift_cst Q x := (locked (\pi_Q x : Q)).Notation PiConst a := (@EqualTo _ _ a (lock _)).(* embedding declaration, please don't redefine \pi *)
Notation lift_embed qT e := (locked (fun x => \pi_qT (e x) : qT)).

(* Specifications: *)
Lemma eq_lock T T' e : e =1 (@locked (T -> T') (fun x : T => e x)).