(* special notation for the common case when interp = id *)
Notation icast pf v := (@cast _ id _ _ pf v).Notation ijmeq v w := (@jmeq _ id _ _ v w).(** eta expand definitions to prevent universe inconsistencies when using
    the injectivity of constructors of datatypes depending on [[dynamic]] *)

Definition dynamic := sigT P.Definition dyn := existT P.Definition dyn_tp := @projT1 _ P.Definition dyn_val := @projT2 _ P.Definition dyn_eta := @sigT_eta _ P.Definition dyn_injT := @eq_sigT_fst _ P.Definition dyn_inj := @inj_pair2 _ P.Notation idyn v := (@dyn _ id _ v).

(* Specifications: *)
Lemma dynE (A B : Type) interp (pf : A = B) (v : interp A) (w : interp B) : jmeq interp v w <-> dyn interp v = dyn interp w.