Proof using.
induction 1; intros; simpl in *; eauto using IR_equivalent_refl.
Qed.
Section Examples.
Example IR_equiv_eg1 :
forall k k',
k <> k' ->
IR_equivalent [IRI k; IRI k'; IRO k; IRO k'] [IRI k; IRO k; IRI k'; IRO k'].
Proof using.
intros.
constructor.
econstructor; auto.
red.
intuition (auto; congruence).
Qed.
Example IR_equiv_eg2 :
forall k k',
k <> k' ->
IR_equivalent [IRI k; IRI k'; IRO k; IRO k'] [IRI k'; IRO k'; IRI k; IRO k].
Proof using.
intros.
eapply IR_equiv_trans with (l2 := [IRI k; IRI k'; IRO k'; IRO k]).
- repeat constructor; unfold good_move; intuition (try congruence).
- eapply IR_equiv_trans with (l2 := [IRI k'; IRI k; IRO k'; IRO k]).
+ apply IR_equiv_move; auto using IR_equivalent_refl.
red. intuition congruence.
+ constructor. apply IR_equiv_move; auto.
red. intuition congruence.
Qed.
Example IR_equiv_eg3 :
forall k k',
k <> k' ->
IR_equivalent [IRI k; IRI k'; IRO k'; IRO k] [IRI k'; IRO k'; IRI k; IRO k].
Proof using.
intros.
eapply IR_equiv_trans with (l2 := [IRI k'; IRI k; IRO k'; IRO k]).
- constructor.
+ apply IR_equivalent_refl.
+ red. intuition congruence.
- constructor. constructor.
+ apply IR_equivalent_refl.
+ red. intuition congruence.
Qed.
Example IR_equiv_eg4 :
forall k k',
k <> k' ->
IR_equivalent [IRI k; IRI k'; IRO k'; IRO k] [IRI k; IRO k; IRI k'; IRO k'].
Proof using.
intros.
constructor.
eapply IR_equiv_trans with (l2 := [IRI k'; IRO k; IRO k']).
- repeat constructor; unfold good_move; intuition congruence.
- eapply IR_equiv_move; auto.
red. intuition congruence.
Qed.
End Examples.
Fixpoint good_trace (l : list IR) : Prop :=
match l with
| [] => True
| IRI k :: IRO k' :: l' => k = k' /\ good_trace l'
| IRI k :: IRU k' :: l' => k = k' /\ good_trace l'
| _ => False
end.
Definition equivalent (l : list op) (ir : list IR) : Prop :=
good_trace ir /\
exists ir',
acknowledge_all_ops l ir' /\
IR_equivalent ir' ir.

(* Specifications: *)
Lemma acknowledge_all_ops_func_IRU_In :
forall l ir k,
In (IRU k) (acknowledge_all_ops_func l ir) ->
In (I k) l.