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.
Proof using.
intros. unfold no_entries_past_current_term in *. 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.
- unfold no_entries_past_current_term_nw.
intros. simpl in *.
find_apply_hyp_hyp. intuition.
+ intros.
match goal with
| _ : In ?p _ |- _ =>
assert (In p (nwPackets net)) by (find_rewrite; in_crush)
end.
eapply_prop no_entries_past_current_term_nw; eauto.
+ exfalso.
do_in_map. subst.
simpl in *.
find_apply_hyp_hyp. find_rewrite. repeat eexists; eauto.
Qed.
Proof using.
intros. unfold no_entries_past_current_term in *. 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.
- unfold no_entries_past_current_term_nw.
intros. simpl in *.
find_apply_hyp_hyp. intuition.
+ intros.
match goal with
| _ : In ?p _ |- _ =>
assert (In p (nwPackets net)) by (find_rewrite; in_crush)
end.
eapply_prop no_entries_past_current_term_nw; eauto.
+ exfalso. subst. repeat find_rewrite.
forwards; intuition.
repeat eexists; eauto.
Qed.
Proof using.
intros. unfold no_entries_past_current_term in *. 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.
- unfold no_entries_past_current_term_nw.
intros. simpl in *.
find_apply_hyp_hyp.
match goal with
| _ : In ?p _ |- _ =>
assert (In p (nwPackets net)) by (find_rewrite; in_crush)
end.
eapply_prop no_entries_past_current_term_nw; eauto.
Qed.
Proof using.
intros.
unfold handleAppendEntriesReply, 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_reply.
intros. find_apply_lem_hyp handleAppendEntriesReply_spec.
intuition eauto using no_entries_past_current_term_unaffected.
Qed.

Lemma handleRequestVote_spec :
forall h st t h' pli plt st' m,
handleRequestVote h st t h' pli plt = (st', m) ->
(currentTerm st <= currentTerm st' /\
log st' = log st /\
~ is_append_entries m).