Fixpoint weak_exec_seq (m: moves) (e: env) {struct m}: env :=
  match m with
  | nil => e
  | (s, d) :: m' => weak_exec_seq m' (weak_update d (e s) e)
  end.Definition disjoint_list (r: reg) (l: list reg) : Prop :=
  forall r', In r' l -> disjoint r r'.Inductive pairwise_disjoint: list reg -> Prop :=
  | pairwise_disjoint_nil:
      pairwise_disjoint nil
  | pairwise_disjoint_cons: forall r l,
      disjoint_list r l ->
      pairwise_disjoint l ->
      pairwise_disjoint (r :: l).Inductive pairwise_disjoint: list reg -> Prop :=
  | pairwise_disjoint_nil:
      pairwise_disjoint nil
  | pairwise_disjoint_cons: forall r l,
      disjoint_list r l ->
      pairwise_disjoint l ->
      pairwise_disjoint (r :: l).Inductive pairwise_disjoint: list reg -> Prop :=
  | pairwise_disjoint_nil:
      pairwise_disjoint nil
  | pairwise_disjoint_cons: forall r l,
      disjoint_list r l ->
      pairwise_disjoint l ->
      pairwise_disjoint (r :: l).Definition disjoint_temps (r: reg) : Prop :=
  forall t, is_temp t -> disjoint r t.

(* Specifications: *)
Lemma disjoint_list_notin: forall r l, disjoint_list r l -> ~In r l.
Lemma pairwise_disjoint_norepet: forall l, pairwise_disjoint l -> list_norepet l.
Lemma disjoint_temps_not_temp: forall r, disjoint_temps r -> is_not_temp r.
Lemma mu_is_mill: is_mill mu.
Lemma mu_move_no_temp: move_no_temp mu.
Lemma disjoint_list_notin: forall r l, disjoint_list r l -> ~In r l.
Lemma pairwise_disjoint_norepet: forall l, pairwise_disjoint l -> list_norepet l.
Lemma disjoint_temps_not_temp: forall r, disjoint_temps r -> is_not_temp r.
Lemma mu_is_mill: is_mill mu.
Lemma mu_move_no_temp: move_no_temp mu.