Proof using.
unfold votes_correct, cronies_correct.
intros. break_and.
match goal with
| [ H : context [ votes_nw ], H' : context [ pBody ] |- _ ] =>
eapply H in H'
end.
unfold candidateEntries in *. break_exists. break_and.
match goal with
| H : wonElection _ = _ |- _ =>
eapply wonElection_one_in_common in H; [|clear H; eauto]
end.
break_exists.
break_and.
simpl in *.
intuition.
- subst.
apply_prop_hyp cronies_votes In.
assert (x = pDst p) by (eapply_prop one_vote_per_term; eauto).
subst. concludes. contradiction.
- apply_prop_hyp votes_received_cronies In. concludes.
apply_prop_hyp cronies_votes In.
apply_prop_hyp cronies_votes In.
unfold raft_data in *. unfold raft_refined_base_params, raft_refined_multi_params in *.
simpl in *.
repeat find_reverse_rewrite.
assert (x = pDst p) by (eapply_prop one_vote_per_term; eauto).
subst.
repeat concludes. contradiction.
Qed.

(* Specifications: *)
Lemma candidateEntries_ext :
forall e sigma sigma',
(forall h, sigma' h = sigma h) ->
candidateEntries e sigma ->
candidateEntries e sigma'.