(* copy predicate *)

Definition copy_p (c : Config) (t : class_trans c) :=
  match t with
  | make_copy s1 s2 h1 h2 => True
  | _ => False
  end.Inductive legal_no_copy : Config -> Prop :=
  | no_copy_init : legal c0 -> legal_no_copy c0
  | after_no_copy :
      forall (c : Config) (t : class_trans c),
      ~ copy_p c t -> legal_no_copy c -> legal_no_copy (transition c t).Inductive legal_no_copy : Config -> Prop :=
  | no_copy_init : legal c0 -> legal_no_copy c0
  | after_no_copy :
      forall (c : Config) (t : class_trans c),
      ~ copy_p c t -> legal_no_copy c -> legal_no_copy (transition c t).Inductive legal_no_copy : Config -> Prop :=
  | no_copy_init : legal c0 -> legal_no_copy c0
  | after_no_copy :
      forall (c : Config) (t : class_trans c),
      ~ copy_p c t -> legal_no_copy c -> legal_no_copy (transition c t).

Lemma decide_empty_queue : forall (c : Config) (s1 s2 : Site), {bm c s1 s2 = empty Message} + {bm c s1 s2 <> empty Message}.