Section AllEntriesLeaderSublog.
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 {cei : candidate_entries_interface}.
Context {lsi : leader_sublog_interface}.
Context {olpti : one_leader_per_term_interface}.
Context {aecei : allEntries_candidate_entries_interface}.
Context {vci : votes_correct_interface}.
Context {cci : cronies_correct_interface}.
Proof using lsi rri.
intros.
pose proof (lift_prop _ leader_sublog_invariant_invariant _ ltac:(eauto)) as Hinv.
unfold leader_sublog_invariant, leader_sublog_nw_invariant in *.
destruct Hinv as [Hhost Hnw].
find_apply_lem_hyp ghost_packet.
eapply_prop_hyp In In; eauto; try find_rewrite_lem deghost_spec; try rewrite deghost_spec; eauto.
Qed.
Proof using olpti rri.
intros.
eapply (lift_prop _ one_leader_per_term_invariant _ ltac:(eauto));
simpl in *; repeat break_match; repeat (find_rewrite; simpl in *);
auto; simpl in *; repeat find_rewrite; simpl in *; auto.
Qed.
Proof using.
intros.
apply in_map_iff.
eexists; intuition; eauto; reflexivity.
Qed.
Hint Resolve map_snd : core.
Proof using olpti rri.
red. unfold allEntries_leader_sublog. intros. simpl in *.
subst. repeat find_higher_order_rewrite.
find_copy_apply_lem_hyp handleClientRequest_type. intuition.
destruct_update; simpl in *; eauto;
do_in_map; subst;
destruct x; simpl in *.
- find_apply_lem_hyp update_elections_data_client_request_log_allEntries.
intuition; repeat find_rewrite; eauto.
break_exists. intuition. repeat find_rewrite. simpl in *.
intuition; repeat find_rewrite; eauto; solve_by_inversion.
- find_apply_lem_hyp update_elections_data_client_request_log_allEntries.
intuition; repeat find_rewrite; eauto.
break_exists. intuition. repeat find_rewrite. simpl in *.
intuition; repeat find_rewrite; eauto; solve_by_inversion.
- find_apply_lem_hyp update_elections_data_client_request_log_allEntries.
intuition; repeat find_rewrite; eauto.
break_exists. intuition. repeat find_rewrite. simpl in *.
intuition; repeat find_rewrite; eauto.
tuple_inversion.
repeat find_rewrite.
find_false.
eapply lifted_one_leader_per_term; eauto.
Qed.
Proof using.
intros.
unfold update_elections_data_appendEntries in *.
unfold handleAppendEntries, advanceCurrentTerm in *.
repeat break_match; repeat find_inversion; subst; simpl in *; auto;
congruence.
Qed.
Proof using lsi rri.
red. unfold allEntries_leader_sublog. intros. simpl in *.
subst. repeat find_higher_order_rewrite.
destruct_update; simpl in *; eauto;
do_in_map; subst;
destruct x; simpl in *.
- find_eapply_lem_hyp update_elections_data_appendEntries_log_allEntries_leader; eauto.
intuition.
repeat find_rewrite; eauto.
- find_eapply_lem_hyp update_elections_data_appendEntries_log_allEntries_leader; eauto.
intuition.
repeat find_rewrite; eauto.
- find_eapply_lem_hyp update_elections_data_appendEntries_allEntries_term'; eauto.
intuition;
eauto using lifted_leader_sublog_nw.
Qed.
Proof using.
red. unfold allEntries_leader_sublog. intros. simpl in *.
subst. repeat find_higher_order_rewrite.
destruct_update; simpl in *; eauto;
do_in_map; subst;
destruct x; simpl in *;
find_copy_apply_lem_hyp handleAppendEntriesReply_type;
find_apply_lem_hyp handleAppendEntriesReply_log;
intuition; repeat find_rewrite; eauto; congruence.
Qed.
Proof using.
red. unfold allEntries_leader_sublog. intros. simpl in *.
subst. repeat find_higher_order_rewrite.
destruct_update; simpl in *; eauto;
do_in_map; subst;
destruct x; simpl in *;
find_copy_apply_lem_hyp handleRequestVote_type;
find_apply_lem_hyp handleRequestVote_log;
try find_erewrite_lem update_elections_data_requestVote_allEntries; eauto;
intuition; repeat find_rewrite; eauto; try congruence.
Qed.
Proof using.
intros.
unfold handleRequestVoteReply, advanceCurrentTerm in *.
repeat break_match; try find_inversion; subst; simpl in *; intuition;
do_bool; intuition; try right; congruence.
Qed.
Proof using cci vci aecei.
red. unfold allEntries_leader_sublog. intros. simpl in *.
subst. repeat find_higher_order_rewrite.
match goal with
| |- context [handleRequestVoteReply ?h ?st ?h' ?t ?v] =>
pose proof handleRequestVoteReply_spec h st h' t v
(handleRequestVoteReply h st h' t v)
end.
destruct_update; simpl in *; eauto;
do_in_map; subst;
destruct x; simpl in *;
try find_rewrite_lem update_elections_data_requestVoteReply_allEntries;
intuition; repeat find_rewrite; eauto; try congruence.
- match goal with
| _ : context [type ?st = Leader -> False] |- _ =>
destruct (serverType_eq_dec (type st) Leader)
end; eauto.
+ match goal with
| _ : context [handleRequestVoteReply ?h ?st ?h' ?t ?v] |- _ =>
pose proof handleRequestVoteReply_type h st h' t v
(handleRequestVoteReply h st h' t v)
end.
intuition; repeat find_rewrite; try congruence.
eauto.
+ intuition.
find_copy_apply_lem_hyp allEntries_candidateEntries_invariant; auto.
match goal with
| _ : context [handleRequestVoteReply ?h ?st ?h' ?t ?v] |- _ =>
pose proof handleRequestVoteReply_RVR_spec h st h' t v
(handleRequestVoteReply h st h' t v)
end. intuition; repeat find_rewrite; try congruence.
subst.
find_eapply_lem_hyp wonElection_candidateEntries_rvr;
eauto using votes_correct_invariant, cronies_correct_invariant.
unfold ghost_data in *. simpl in *.
unfold raft_refined_base_params, raft_refined_multi_params in *.
congruence.
- match goal with
| _ : context [type ?st = Leader -> False] |- _ =>
destruct (serverType_eq_dec (type st) Leader)
end; eauto.
+ match goal with
| _ : context [handleRequestVoteReply ?h ?st ?h' ?t ?v] |- _ =>
pose proof handleRequestVoteReply_type h st h' t v
(handleRequestVoteReply h st h' t v)
end.
intuition; repeat find_rewrite; try congruence.
eauto.
+ intuition.
find_copy_apply_lem_hyp allEntries_candidateEntries_invariant; auto.
match goal with
| _ : context [handleRequestVoteReply ?h ?st ?h' ?t ?v] |- _ =>
pose proof handleRequestVoteReply_RVR_spec h st h' t v
(handleRequestVoteReply h st h' t v)
end. intuition; repeat find_rewrite; try congruence.
subst.
find_eapply_lem_hyp wonElection_candidateEntries_rvr;
eauto using votes_correct_invariant, cronies_correct_invariant.
unfold ghost_data in *. simpl in *.
unfold raft_refined_base_params, raft_refined_multi_params in *.
congruence.
Qed.
Proof using.
red. unfold allEntries_leader_sublog. intros. simpl in *.
subst. repeat find_higher_order_rewrite.
destruct_update; simpl in *; eauto;
do_in_map; subst;
destruct x; simpl in *;
find_copy_apply_lem_hyp handleTimeout_type;
find_apply_lem_hyp handleTimeout_log_same;
try find_rewrite_lem update_elections_data_timeout_allEntries;
intuition; repeat find_rewrite; eauto; try congruence.
Qed.
Proof using.
red. unfold allEntries_leader_sublog. intros. simpl in *.
match goal with
| H : nwState ?net ?h = (?gd, ?d) |- _ =>
replace gd with (fst (nwState net h)) in * by (rewrite H; reflexivity);
replace d with (snd (nwState net h)) in * by (rewrite H; reflexivity);
clear H
end.
subst. repeat find_higher_order_rewrite.
destruct_update; simpl in *; eauto;
do_in_map; subst;
destruct x; simpl in *;
find_copy_apply_lem_hyp doLeader_type;
find_apply_lem_hyp doLeader_log;
intuition; repeat find_rewrite; eauto; try congruence.
Qed.

Lemma allEntries_leader_sublog_do_generic_server :
refined_raft_net_invariant_do_generic_server allEntries_leader_sublog.