Section OneLeaderLogPerTerm.
Context {orig_base_params : BaseParams}.
Context {one_node_params : OneNodeParams orig_base_params}.
Context {raft_params : RaftParams orig_base_params}.
Context {rri : raft_refinement_interface}.
Context {llvwli : leaderLogs_votesWithLog_interface}.
Context {vci : votes_correct_interface}.
Context {cci : cronies_correct_interface}.
Context {vvci : votes_votesWithLog_correspond_interface}.
Context {lltsi : leaderLogs_term_sanity_interface}.
Ltac start :=
red; unfold one_leaderLog_per_term; simpl; intros.
Ltac start_update :=
start;
repeat find_higher_order_rewrite;
repeat (update_destruct; subst; rewrite_update);
[| | |eauto].
Proof using.
start. contradiction.
Qed.
Proof using.
unfold one_leaderLog_per_term. intros.
repeat find_higher_order_rewrite;
repeat (update_destruct; subst; rewrite_update);
simpl in *; repeat find_rewrite; eauto.
Qed.
Ltac start_unchanged :=
red; intros; eapply one_leaderLog_per_term_unchanged; eauto; subst.
(* solve invariant by lemma which shows leader logs do not change *)
Ltac unchanged lem :=
start_unchanged; apply lem.
Proof using.
unchanged update_elections_data_client_request_leaderLogs.
Qed.
Proof using.
unchanged update_elections_data_timeout_leaderLogs.
Qed.
Proof using.
unchanged update_elections_data_appendEntries_leaderLogs.
Qed.
Proof using.
start_unchanged. auto.
Qed.
Proof using.
unchanged leaderLogs_update_elections_data_requestVote.
Qed.

Lemma update_elections_data_requestVoteReply_leaderLogs' :
forall h h' t st t' ll' r,
In (t', ll') (leaderLogs (update_elections_data_requestVoteReply h h' t r st)) ->
In (t', ll') (leaderLogs (fst st))
\/ (r = true
/\ t = currentTerm (snd st)
/\ ll' = log (snd st)
/\ t' = currentTerm (snd st)
/\ type (snd st) = Candidate
/\ wonElection (dedup name_eq_dec (h' :: votesReceived (snd st))) = true).