Proof using vlcti.
unfold refined_raft_net_invariant_request_vote, votes_correct.
split_votes_correct; start_proof.
- find_eapply_lem_hyp votes_update_elections_data_request_vote; eauto.
find_eapply_lem_hyp votes_update_elections_data_request_vote; eauto.
intuition; [eauto | | | congruence]; subst;
find_copy_apply_lem_hyp votes_le_current_term_invariant; auto;
find_copy_apply_lem_hyp handleRequestVote_currentTerm;
do_le_antisym;
match goal with
| [ H : votes_currentTerm_votedFor_correct _, H' : In _ _  |- _ ] =>
apply H in H'; conclude_using congruence
end;
find_apply_lem_hyp handleRequestVote_votedFor; auto;
intuition congruence.
- find_eapply_lem_hyp votes_update_elections_data_request_vote; eauto.
intuition.
subst.
find_copy_apply_lem_hyp votes_le_current_term_invariant; auto.
find_copy_apply_lem_hyp handleRequestVote_currentTerm.
do_le_antisym.
find_apply_hyp_hyp.
find_copy_apply_lem_hyp handleRequestVote_currentTerm_votedFor.
intuition; try omega; try congruence.
- subst.
find_copy_apply_lem_hyp handleRequestVote_currentTerm_votedFor.
repeat find_rewrite.
intuition.
+ eauto using votes_update_elections_data_request_vote_intro.
+ eauto using votes_update_elections_data_request_vote_intro.
+ eauto using votes_update_elections_data_request_vote_intro_old.
Qed.

(* Specifications: *)
Lemma votes_correct_request_vote_reply :
refined_raft_net_invariant_request_vote_reply votes_correct.