Section TermSanityProof.
Context {orig_base_params : BaseParams}.
Context {one_node_params : OneNodeParams orig_base_params}.
Context {raft_params : RaftParams orig_base_params}.
Proof using.
unfold no_entries_past_current_term_nw in *. intros.
simpl in *. find_apply_hyp_hyp. intuition eauto.
Qed.
Proof using.
unfold no_entries_past_current_term_nw. intros. simpl in *.
find_apply_hyp_hyp. intuition eauto.
Qed.
Proof using.
intros. eapply no_entries_past_current_term_nw_only_new_packets_matter; eauto.
unfold no_entries_past_current_term_nw. intros. simpl in *.
do_in_map. subst. simpl in *.
find_apply_hyp_hyp.
exfalso. match goal with H : _ |- _ => apply H end.
repeat eexists; eauto.
Qed.
Proof using.
intros.
unfold no_entries_past_current_term_nw. intros. simpl in *. find_apply_hyp_hyp.
intuition.
- unfold no_entries_past_current_term_nw in *. eauto.
- subst. exfalso. match goal with H : _ |- _ => apply H end.
repeat eexists; eauto.
Qed.
Proof using.
unfold raft_net_invariant_init, no_entries_past_current_term.
intuition.
- unfold no_entries_past_current_term_host.
intros. simpl in *. intuition.
- unfold no_entries_past_current_term_nw.
intros. simpl in *. intuition.
Qed.
Proof using.
intros. unfold doLeader in *.
repeat break_match; find_inversion; subst; auto.
Qed.
Proof using.
unfold raft_net_invariant_do_leader, no_entries_past_current_term.
intuition.
- unfold no_entries_past_current_term_host in *.
intros. simpl in *.
find_apply_lem_hyp doLeader_spec.
find_higher_order_rewrite.
break_if;
subst; intuition;
repeat find_rewrite;
eauto.
- unfold no_entries_past_current_term_nw in *. intros; simpl in *.
find_apply_hyp_hyp. intuition eauto.
unfold doLeader in *.
repeat break_match; repeat find_inversion; try solve_by_inversion.
repeat do_in_map; subst; simpl in *; find_inversion.
find_apply_lem_hyp findGtIndex_in. eauto.
Qed.
Proof using.
intros. unfold doGenericServer in *.
repeat break_match; find_inversion; subst; intuition;
use_applyEntries_spec; subst; simpl in *; auto.
Qed.
Proof using.
unfold raft_net_invariant_do_generic_server, no_entries_past_current_term. intros.
find_apply_lem_hyp doGenericServer_spec. intuition.
- unfold no_entries_past_current_term_host in *.
intros. simpl in *.
find_higher_order_rewrite; break_match; eauto.
subst; repeat find_rewrite; eauto.
- eauto using no_entries_past_current_term_nw_no_append_entries.
Qed.
Proof using.
intros. unfold handleClientRequest in *.
break_match; find_inversion; subst; intuition.
Qed.
Proof using.
unfold raft_net_invariant_client_request, no_entries_past_current_term.
intuition.
- unfold no_entries_past_current_term_host in *.
intros. simpl in *.
find_higher_order_rewrite; break_if; eauto.
unfold handleClientRequest in *.
subst.
break_match; find_inversion; eauto.
simpl in *. intuition. subst; simpl in *; auto.
- eauto using no_entries_past_current_term_nw_no_append_entries,
handleClientRequest_messages.
Qed.
Proof using.
intros. unfold handleTimeout, tryToBecomeLeader in *.
repeat break_match; find_inversion; subst; intuition;
do_in_map; subst; simpl in *; congruence.
Qed.
Proof using.
unfold raft_net_invariant_timeout, no_entries_past_current_term.
intros. find_apply_lem_hyp handleTimeout_spec.
intuition.
- unfold no_entries_past_current_term_host in *.
intros. simpl in *.
find_higher_order_rewrite; break_if; eauto.
subst; repeat find_rewrite.
eapply le_trans; [|eauto]; eauto.
- eauto using no_entries_past_current_term_nw_no_append_entries.
Qed.
Proof using.
intros.
unfold handleAppendEntries, advanceCurrentTerm in *.
repeat break_match; try find_inversion; subst; simpl in *; intuition;
do_bool; intuition; try solve [break_exists; congruence];
in_crush; eauto using removeAfterIndex_in.
Qed.
Proof using.
unfold raft_net_invariant_append_entries, no_entries_past_current_term.
intros. find_apply_lem_hyp handleAppendEntries_spec.
intuition.
- unfold no_entries_past_current_term_host in *.
intros. simpl in *. find_higher_order_rewrite.
break_if; eauto. subst.
find_apply_hyp_hyp. intuition.
+ eapply le_trans; [|eauto]; eauto.
+ subst.
eapply_prop no_entries_past_current_term_nw; eauto.
- match goal with
| _ : context [{| pSrc := ?ps; pDst := ?pd; pBody := ?pb |}] |- _ =>
eapply no_entries_past_current_term_nw_not_append_entries
with (p' := {| pSrc := ps; pDst := pd; pBody := pb |})
end; eauto.
intros. find_apply_hyp_hyp. find_rewrite. in_crush.
Qed.

Lemma no_entries_past_current_term_unaffected :
forall net st' ps' xs p ys d ms,
nwPackets net = xs ++ p :: ys ->
no_entries_past_current_term net ->
(forall h : Net.name, st' h = update name_eq_dec (nwState net) (pDst p) d h) ->
(forall p' : packet,
In p' ps' ->
In p' (xs ++ ys) \/ In p' (send_packets (pDst p) ms)) ->
currentTerm (nwState net (pDst p)) <= currentTerm d ->
log d = log (nwState net (pDst p)) ->
(forall m, In m ms -> ~ is_append_entries (snd m)) ->
no_entries_past_current_term {| nwPackets := ps'; nwState := st' |}.