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.

(* Specifications: *)
Lemma no_overlap_sym:
forall r1 r2, no_overlap r1 r2 -> no_overlap r2 r1.
Lemma no_overlap_sym:
forall r1 r2, no_overlap r1 r2 -> no_overlap r2 r1.