(** - Some stuff I thought would be useful some day but wasn't *)

Definition before (N N' : nat) (i : fin N) (j : fin N') := index i < index j.Definition after (N N' : nat) (i : fin N) (j : fin N') := index i > index j.Definition notbefore (N N' : nat) (i : fin N) (j : fin N') :=
  index i = index j \/ after i j.Definition notafter (N N' : nat) (i : fin N) (j : fin N') :=
  before i j \/ index i = index j.

(* Specifications: *)
Lemma decide_fin : forall (N N' : nat) (i : fin N) (i' : fin N'), before i i' \/ index i = index i' \/ after i i'.
Lemma decide_before : forall (N N' : nat) (i : fin N) (j : fin N'), before i j \/ notbefore i j.
Lemma decide_after : forall (N N' : nat) (i : fin N) (j : fin N'), after i j \/ notafter i j.
Lemma seq_properties_split_before_eq_after : forall (A : Setoid) (n : nat) (v : seq n A) (i : fin n) (P : Predicate A), (forall j : fin n, before j i -> Pred_fun P (v j)) -> Pred_fun P (v i) -> (forall j : fin n, after j i -> Pred_fun P (v j)) -> forall j : fin n, Pred_fun P (v j).
Lemma predicate_split_seq_before_notbefore : forall (A : Setoid) (n : nat) (v : seq n A) (i : fin n) (P : Predicate A), (forall j : fin n, before j i -> Pred_fun P (v j)) -> (forall j : fin n, notbefore j i -> Pred_fun P (v j)) -> forall j : fin n, Pred_fun P (v j).
Lemma predicate_split_seq_after_notafter : forall (A : Setoid) (n : nat) (v : seq n A) (i : fin n) (P : Predicate A), (forall j : fin n, after j i -> Pred_fun P (v j)) -> (forall j : fin n, notafter j i -> Pred_fun P (v j)) -> forall j : fin n, Pred_fun P (v j).
Lemma seq_properties_split_before_notbefore : forall (A : Setoid) (n : nat) (v : seq n A) (i : fin n) (P : A -> Prop), (forall j : fin n, before j i -> P (v j)) -> (forall j : fin n, notbefore j i -> P (v j)) -> forall j : fin n, P (v j).
Lemma seq_properties_split_after_notafter : forall (A : Setoid) (n : nat) (v : seq n A) (i : fin n) (P : A -> Prop), (forall j : fin n, after j i -> P (v j)) -> (forall j : fin n, notafter j i -> P (v j)) -> forall j : fin n, P (v j).