(** * Interoperation with [Coq.Classes.Morphisms] *)
(** Although ultimately we will reimplement a [rewrite] tactic, and our system is largely designed to replace the setoid rewriting support in [Coq.Classes.Morphisms], we still want to be compatible with it so that:  - we can take advantage of the relational properties declared in the old system; - the generalized [setoid_rewrite] can take advantage of our library for answering its [Morphisms.Proper] queries.  This compatibility layer is pretty straightforward: we simply declare the instances we need in order to use the properties declared in the old system, and use [rauto] to handle [Morphisms.Proper] queries. *)
(** ** Using [Morphisms]-style relational properties *)
(** *** Relators *)
(** While [Coq.Classes.Morphisms] uses a distinct set of relators from ours, we don't try to map them into our language. Instead, we hook them into our system the same way we do our generalized versions, so that [respectful] and the like can be used as just another set of "native" Coqrel relators. *)
Global Instance respectful_subrel A B:
Monotonic (@respectful A B) (subrel --> subrel ++> subrel).
Global Instance respectful_params:
Params (@respectful) 4.
Defined.
Hint Extern 0 (RIntro _ (respectful _ _) _ _) =>
eapply respectful_rintro : typeclass_instances.
Hint Extern 1 (RElim (respectful _ _) _ _ _ _) =>
eapply respectful_relim : typeclass_instances.
Global Instance forall_relation_subrel A P:
Monotonic (@forall_relation A P) ((forallr -, subrel) ++> subrel).
Global Instance forall_relation_params:
Params (@forall_relation) 3.
Defined.
Hint Extern 0 (RIntro _ (forall_relation _) _ _) =>
eapply forall_relation_rintro : typeclass_instances.
Hint Extern 1 (RElim (forall_relation _) _ _ _ _) =>
eapply forall_relation_relim : typeclass_instances.
Global Instance pointwise_relation_subrel A B:
Monotonic (@pointwise_relation A B) (subrel ++> subrel).
Global Instance pointwise_relation_params:
Params (@pointwise_relation) 3.
Defined.
Hint Extern 0 (RIntro _ (pointwise_relation _ _) _ _) =>
eapply pointwise_relation_rintro : typeclass_instances.

Lemma pointwise_relation_relim {A B} (R: relation B) f g a P Q:
RElim R (f a) (g a) P Q ->
RElim (pointwise_relation A R) f g P Q.