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.

Lemma leader_sublog_invariant_subset :
forall net net',
leader_sublog_invariant net ->
(forall p, is_append_entries (pBody p) -> In p (nwPackets net') -> In p (nwPackets net)) ->
(forall h, log (nwState net h) = log (nwState net' h)) ->
(forall h, type (nwState net' h) = Leader ->
type (nwState net h) = Leader /\
currentTerm (nwState net h) = currentTerm (nwState net' h)) ->
leader_sublog_invariant net'.