Section REGISTER_CLASSES.
Variable class: Type.
Variable regclass: reg -> class.
Hypothesis temp_preserves_class: forall r, regclass (temp r) = regclass r.
Definition is_class_compatible (mu: moves) : Prop :=
forall s d, In (s, d) mu -> regclass s = regclass d.
End REGISTER_CLASSES.
(** * Extension to partially overlapping registers *)
(** We now extend the previous results to the case where distinct registers can partially overlap, so that assigning to one register changes the value of the other.  We asuume given a disjointness relation [disjoint] between registers. *)
Variable disjoint: reg -> reg -> Prop.
Hypothesis disjoint_sym:
forall r1 r2, disjoint r1 r2 -> disjoint r2 r1.
Hypothesis disjoint_not_equal:
forall r1 r2, disjoint r1 r2 -> r1 <> r2.
(** Two registers partially overlap if they are different and not disjoint. For the Coq development, it is easier to define the complement: two registers do not partially overlap if they are identical or disjoint. *)
Definition no_overlap (r1 r2: reg) : Prop :=
r1 = r2 \/ disjoint r1 r2.

Lemma no_overlap_sym:
forall r1 r2, no_overlap r1 r2 -> no_overlap r2 r1.