Section LeaderSublogProof.
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 {vci : votes_correct_interface}.
Context {cci : cronies_correct_interface}.
Context {olpti : one_leader_per_term_interface}.
Ltac prove_in :=
match goal with
| [ _ : nwPackets ?net = _,
_ : In (?p : packet) _ |- _] =>
assert (In p (nwPackets net)) by (repeat find_rewrite; do_in_app; intuition)
| [ _ : nwPackets ?net = _,
_ : pBody ?p = _ |- _] =>
assert (In p (nwPackets net)) by (repeat find_rewrite; intuition)
end.
Notation is_append_entries m :=
(exists t n prevT prevI entries c,
m = AppendEntries t n prevT prevI entries c).
Proof using.
unfold leader_sublog_host_invariant in *. intros.
specialize (H leader e h).
forward H; [apply H1; auto|].
intuition.
rewrite H0 in *. specialize (H1 leader). intuition.
rewrite H7 in *; auto.
rewrite H0 in *. auto.
Qed.
Proof using.
unfold leader_sublog_invariant in *. intros; intuition.
- eauto using leader_sublog_invariant_same_state.
- unfold leader_sublog_nw_invariant in *. intros.
pose proof H1 leader.
pose proof H2 leader; concludes.
pose proof H3 leader. intuition.
symmetry in H13.
repeat find_rewrite.
eapply H11; simpl in *; repeat find_rewrite; eauto.
assert (is_append_entries (pBody p)) by (repeat eexists; eauto).
eauto.
Qed.

Theorem leader_sublog_do_leader :
raft_net_invariant_do_leader leader_sublog_invariant.