Section eqit_eq.
(** *** Properties of relation transformers. *)
Context {E : Type -> Type} {R : Type}.
Local Notation eqit := (@eqit E R R eq).
Global Instance Reflexive_eqitF_eq b1 b2 (sim : itree E R -> itree E R -> Prop)
: Reflexive sim -> Reflexive (eqitF eq b1 b2 id sim).
Global Instance Symmetric_eqitF_eq b (sim : itree E R -> itree E R -> Prop)
: Symmetric sim -> Symmetric (eqitF eq b b id sim).
Global Instance Reflexive_eqit__eq b1 b2 (sim : itree E R -> itree E R -> Prop)
: Reflexive sim -> Reflexive (eqit_ eq b1 b2 id sim).
Global Instance Reflexive_eqit_eq b1 b2 : Reflexive (eqit b1 b2).
Global Instance Symmetric_eqit_eq b : Symmetric (eqit b b).
(** *** Congruence properties *)
Global Instance eqit_observe b1 b2:
Proper (eqit b1 b2 ==> going (eqit b1 b2)) (@observe E R).
Global Instance eqit_tauF b1 b2:
Proper (eqit b1 b2 ==> going (eqit b1 b2)) (@TauF E R _).
Global Instance eqit_VisF b1 b2 {u} (e: E u) :
Proper (pointwise_relation _ (eqit b1 b2) ==> going (eqit b1 b2)) (VisF e).
Global Instance observing_sub_eqit l r :
subrelation (observing eq) (eqit l r).
(** ** Eta-expansion *)
(** *** Transitivity properties *)
Inductive rcompose {R1 R2 R3} (RR1: R1->R2->Prop) (RR2: R2->R3->Prop) (r1: R1) (r3: R3) : Prop :=
| rcompose_intro r2 (REL1: RR1 r1 r2) (REL2: RR2 r2 r3)
.
Hint Constructors rcompose.

Lemma eqit_trans {E R1 R2 R3} (RR1: R1->R2->Prop) (RR2: R2->R3->Prop) b1 b2 t1 t2 t3
(INL: eqit RR1 b1 b2 t1 t2)
(INR: eqit RR2 b1 b2 t2 t3):
@eqit E _ _ (rcompose RR1 RR2) b1 b2 t1 t3.