Proof using vvci cci vci llvwli.
intros. unfold not in *. find_false.
simpl in *. find_apply_lem_hyp update_elections_data_requestVoteReply_leaderLogs'.
intro_refined_invariant leaderLogs_votesWithLog_invariant.
break_or_hyp; repeat (apply_prop_hyp leaderLogs_votesWithLog In; break_exists).
- assert (exists h, In h x /\ In h x0) by (apply pigeon_nodes; intuition).
break_exists; break_and.
do 2 (find_apply_hyp_hyp; break_exists; break_and).
intro_refined_invariant votes_votesWithLog_correspond_invariant.
do 2 (apply_prop_hyp votes_votesWithLog In).
intro_refined_invariant votes_correct_invariant.
eauto.
- assert (exists h, In h x /\ In h (dedup name_eq_dec (pSrc p :: votesReceived (snd (nwState net (pDst p)))))).
{ eapply pigeon_nodes.
- intuition.
- apply NoDup_dedup.
- intuition.
- apply wonElection_length; intuition. }
break_exists. break_and.
find_apply_hyp_hyp; break_exists; break_and.
intro_refined_invariant votes_votesWithLog_correspond_invariant.
apply_prop_hyp votes_votesWithLog In.
find_apply_lem_hyp in_dedup_was_in.
simpl in *.
intro_refined_invariant cronies_correct_invariant.
intro_refined_invariant votes_correct_invariant.
break_or_hyp; eauto.
Qed.

Lemma one_leaderLog_per_term_request_vote_reply :
refined_raft_net_invariant_request_vote_reply one_leaderLog_per_term.