Ltac rel_curry2_set_le_transport keyword :=
lazymatch goal with
| |- @Transport ?A ?B ?R ?a ?b ?PA ?PB =>
lazymatch PA with
| context [keyword] =>
let Xv := fresh "X" in evar (Xv: Type);
let X := eval red in Xv in clear Xv;
let Yv := fresh "Y" in evar (Yv: Type);
let Y := eval red in Yv in clear Yv;
let Zv := fresh "Y" in evar (Yv: Type);
let Z := eval red in Yv in clear Yv;
unify B (X -> Y -> Z -> Prop);
eapply rel_curry2_set_le_transport
end
end.
(** The situation for [impl] is similar: since this transport instance can apply to pretty much anything, we need to register it on a case-by-case basis. Here is an example used in the CertiKOS proof for hypotheses of the form [writable_block ge b]: << Hint Extern 10 (Transport _ _ _ (writable_block _ _) _) => eapply impl_transport : typeclass_instances. >> *)

(* Specifications: *)
Lemma impl_transport P Q:
Transport impl P Q P Q.