Section TermsAndIndicesFromOneLog.
Context {orig_base_params : BaseParams}.
Context {one_node_params : OneNodeParams orig_base_params}.
Context {raft_params : RaftParams orig_base_params}.
Context {ctgzi : current_term_gt_zero_interface}.
Definition terms_and_indices_from_one_log_ind (net : network) : Prop :=
terms_and_indices_from_one_log net /\ terms_and_indices_from_one_log_nw net.
Proof using.
split.
- unfold terms_and_indices_from_one_log, terms_and_indices_from_one. simpl. contradiction.
- unfold terms_and_indices_from_one_log_nw, terms_and_indices_from_one. simpl. contradiction.
Qed.
Proof using.
intros. find_apply_hyp_hyp. break_or_hyp; eauto. unfold send_packets in *. do_in_map.
find_apply_hyp_hyp. unfold not in *. find_false.
subst. simpl in *. repeat find_rewrite. eauto 10.
Qed.
Proof using ctgzi.
red. unfold terms_and_indices_from_one_log_ind. split; red; simpl in *; intuition.
- find_higher_order_rewrite. update_destruct; subst; rewrite_update; auto.
find_apply_lem_hyp handleClientRequest_log. intuition.
+ repeat find_rewrite. auto.
+ break_exists. intuition.
unfold terms_and_indices_from_one_log, terms_and_indices_from_one in *.
intros. repeat find_rewrite. simpl in *. break_or_hyp.
* intuition. find_apply_lem_hyp current_term_gt_zero_invariant. find_rewrite.
eapply_prop current_term_gt_zero. congruence.
* eauto.
- eapply taifol_no_append_entries; pose handleClientRequest_no_append_entries; eauto.
Qed.
Proof using.
red. unfold terms_and_indices_from_one_log_ind. split; red; simpl in *; intuition.
- find_higher_order_rewrite. update_destruct; subst; rewrite_update; auto.
find_apply_lem_hyp handleTimeout_log_same. find_rewrite. auto.
- eapply taifol_no_append_entries; pose handleTimeout_packets; eauto.
Qed.
Proof using.
induction xs.
- auto.
- unfold terms_and_indices_from_one in *. simpl. intros. break_or_hyp; eauto.
Qed.
Proof using.
unfold terms_and_indices_from_one. eauto.
Qed.
Proof using.
red. unfold terms_and_indices_from_one_log_ind. split; red; simpl in *; intuition.
- find_higher_order_rewrite. update_destruct; subst; rewrite_update; auto.
find_apply_lem_hyp handleAppendEntries_log. intuition.
+ find_rewrite. auto.
+ subst. unfold terms_and_indices_from_one_log_nw in *. eauto.
+ break_exists. intuition. subst. find_rewrite. apply terms_and_indices_from_one_app.
* eauto.
* eapply terms_and_indices_from_one_In; [eapply removeAfterIndex_in | eauto].
- unfold terms_and_indices_from_one_log_nw in *. find_apply_hyp_hyp. intuition; eauto.
find_apply_lem_hyp handleAppendEntries_not_append_entries.
exfalso. apply H. repeat eexists. subst. eauto.
Qed.
Proof using.
red. unfold terms_and_indices_from_one_log_ind. split; red; simpl in *; intuition.
- find_higher_order_rewrite. update_destruct; subst; rewrite_update; auto.
find_apply_lem_hyp handleAppendEntriesReply_log. find_rewrite. auto.
- find_apply_hyp_hyp. intuition; eauto. do_in_map.
find_apply_lem_hyp handleAppendEntriesReply_packets; eauto. subst. contradiction.
Qed.
Proof using.
red. unfold terms_and_indices_from_one_log_ind. split; red; simpl in *; intuition.
- find_higher_order_rewrite. update_destruct; subst; rewrite_update; auto.
find_apply_lem_hyp handleRequestVote_log. find_rewrite. auto.
- find_apply_hyp_hyp. intuition; eauto. find_apply_lem_hyp handleRequestVote_no_append_entries.
unfold not in *. find_false. repeat eexists. subst. eauto.
Qed.
Proof using.
red. unfold terms_and_indices_from_one_log_ind. split; red; simpl in *; intuition.
- find_higher_order_rewrite. update_destruct; rewrite_update; auto.
find_apply_lem_hyp handleRequestVoteReply_log. subst. find_rewrite. auto.
- eauto.
Qed.
Proof using.
red. unfold terms_and_indices_from_one_log_ind. split; red; simpl in *; intuition.
- find_higher_order_rewrite. update_destruct; subst; rewrite_update; auto.
find_apply_lem_hyp doLeader_log. find_rewrite. auto.
- find_apply_hyp_hyp. intuition; eauto.
unfold doLeader in *. repeat break_match; tuple_inversion; subst; try contradiction.
repeat do_in_map. unfold replicaMessage in *. subst. simpl in *. find_inversion.
eapply terms_and_indices_from_one_In. apply findGtIndex_in. auto.
Qed.
Proof using.
red. unfold terms_and_indices_from_one_log_ind. split; red; simpl in *; intuition.
- find_higher_order_rewrite. update_destruct; subst; rewrite_update; auto.
find_apply_lem_hyp doGenericServer_log. find_rewrite. auto.
- find_apply_lem_hyp doGenericServer_packets. find_apply_hyp_hyp. subst. intuition; eauto.
do_in_map. contradiction.
Qed.
Proof using.
red. unfold terms_and_indices_from_one_log_ind. split; red; simpl in *; intuition.
- find_reverse_higher_order_rewrite. auto.
- eauto.
Qed.
Proof using.
red. unfold terms_and_indices_from_one_log_ind. split; red; simpl in *; intuition.
- find_higher_order_rewrite. update_destruct; subst; rewrite_update; auto.
unfold reboot. eauto.
- find_reverse_rewrite. eauto.
Qed.

Lemma terms_and_indices_from_one_log_ind_invariant :
forall net,
raft_intermediate_reachable net ->
terms_and_indices_from_one_log_ind net.