(** ** Double Negation Translation *)

Implicit Type b : logic.Definition cprv := @prv class full.Instance iUnit P : interp unit (fun _ => tt) :=
  {| i_f _ _ := tt ; i_e := tt ; i_P _ _ := True ; i_Q := P  |}.Fixpoint cast {b} (phi : form b) : form full :=
  match phi with
  | Pr s t => Pr s t
  | Q => Q
  | Fal => Fal
  | Impl phi psi => Impl (cast phi) (cast psi)
  | All x phi => All x (cast phi)
  end.

(* Specifications: *)
Lemma subst_cast {b} x t phi : cast (subst x t phi) = subst x t (cast phi).
Lemma consts_casts {b} phi : consts (cast phi) = consts phi.