Ltac workhorse :=
    try match goal with
        | [ |- mkNetwork _ _ = mkNetwork _ _ ] => f_equal
      end;
    try match goal with
        | [ |- (fun _ => _) = (fun _ => _) ] => apply functional_extensionality; intros
      end;
      repeat break_match;
      repeat match goal with
               | [ H : (_, _) = (_, _) |- _ ] => invc H
             end;
      repeat (simpl in *; subst);
      repeat rewrite map_app;
      repeat rewrite map_map.

(* Specifications: *)
Theorem simulation_1 : forall net, refined_raft_intermediate_reachable net -> raft_intermediate_reachable (deghost net).
Theorem lift_prop : forall P, (forall net, raft_intermediate_reachable net -> P net) -> (forall net, refined_raft_intermediate_reachable net -> P (deghost net)).
Theorem simulation_2 : forall net, raft_intermediate_reachable net -> exists rnet, net = deghost rnet /\ refined_raft_intermediate_reachable rnet.
Theorem lower_prop : forall P : _ -> Prop, (forall net, refined_raft_intermediate_reachable net -> P (deghost net)) -> (forall net, raft_intermediate_reachable net -> P net).
Lemma deghost_spec : forall (net : @network _ raft_refined_multi_params) h, nwState (deghost net) h = snd (nwState net h).