Section ILogicEquivOps.
Context {A : Type} `{IL: ILogic A}.
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).

(* Left-rule for limpl. This breaks the discipline of the ILogic presentation since the implication is not strictly the top symbol of the left-hand side, but it remains a convenient rule. *)
Lemma limplL P Q CL CR (HP: CL |-- P) (HR: Q //\\ CL |-- CR) :
(P -->> Q) //\\ CL |-- CR.