Global Instance lforall_lequiv_m:
Proper (pointwise_relation T lequiv ++> lequiv) lforall.
Global Instance lexists_lentails_m:
Proper (pointwise_relation T lentails ++> lentails) lexists.
Global Instance lexists_lequiv_m:
Proper (pointwise_relation T lequiv ++> lequiv) lexists.
Global Instance : Proper (lequiv ==> lequiv ==> iff) lequiv.
Global Instance lequiv_lentails_m : Proper (lequiv ==> lequiv ==> iff) lentails.
Global Instance lentails_lentails_m: Proper (lentails --> lentails ++> impl) lentails.
Global Instance land_lentails_m:
Proper (lentails ++> lentails ++> lentails) land.
Global Instance land_lequiv_m:
Proper (lequiv ==> lequiv ==> lequiv) land.
Global Instance lor_lentails_m:
Proper (lentails ++> lentails ++> lentails) lor.
Global Instance lor_lequiv_m:
Proper (lequiv ==> lequiv ==> lequiv) lor.
Global Instance limpl_lentails_m:
Proper (lentails --> lentails ++> lentails) limpl.
Global Instance limpl_lequiv_m:
Proper (lequiv ==> lequiv ==> lequiv) limpl.
End ILogicMorphisms.
Hint Extern 0 (?x -|- ?x) => reflexivity.
Hint Extern 0 (?P -|- ?Q) => (is_evar P; reflexivity) || (is_evar Q; reflexivity).

(* TODO: also add lforwardR. *)
Lemma lforwardL {A} `{IL: ILogic A} {Q R}:
Q |-- R -> forall P G,
P |-- Q ->
(P |-- R -> G) ->
G.