Require Export Coq.Relations.Relations.
Require Export Coq.Classes.Equivalence.
Definition bisimulation {A: Type} (bis: relation A) (R: relation A): Prop :=
forall m n, bis m n ->
(forall m', R m m' -> exists n', R n n' /\ bis m' n') /\
(forall n', R n n' -> exists m', R m m' /\ bis m' n').
Class Bisimulation {A: Type} (bis: relation A) (R: relation A): Prop := {
bis_l: forall m n, bis m n ->
forall m', R m m' -> exists n', R n n' /\ bis m' n';
bis_r: forall m n, bis m n ->
forall n', R n n' -> exists m', R m m' /\ bis m' n'
}.

(* Specifications: *)
Lemma eq_bis {A: Type} (R: relation A): Bisimulation eq R.
Lemma full_bis {A: Type} (R: relation A) {_: Serial R}: Bisimulation full_relation R.