Fixpoint delete_nth {A} (n: nat) (xs: list A) {struct n} : list A :=
match n, xs with
| O, y::ys => ys
| S n', y::ys =>y :: delete_nth n' ys
| _ , _ => nil
end.
Inductive find_nth_preds_rec {A: Type} (pred: A -> Prop): nat -> list A -> option (nat * A) -> Prop :=
| find_nth_preds_rec_cons_head: forall n R0 R, pred R0 -> find_nth_preds_rec pred n (R0 :: R) (Some (n, R0))
| find_nth_preds_rec_cons_tail: forall n R0 R R_res, find_nth_preds_rec pred (S n) R R_res -> find_nth_preds_rec pred n (R0 :: R) R_res
| find_nth_preds_rec_nil: forall n, find_nth_preds_rec pred n nil None.
Local Unset Elimination Schemes. (* ensure that we avoid name collision with the above *)
Inductive find_nth_preds {A: Type} (pred: A -> Prop): list A -> option (nat * A) -> Prop :=
| find_nth_preds_constr: forall R R_res, find_nth_preds_rec pred 0 R R_res -> find_nth_preds pred R R_res.
Scheme Minimality for find_nth_preds Sort Prop.
Local Set Elimination Schemes.

(* Specifications: *)
Lemma find_nth_preds_Some: forall {A: Type} (pred: A -> Prop) R n R0, find_nth_preds pred R (Some (n, R0)) ->
nth_error R n = Some R0 /\ pred R0.
(* Current not used. *)
Lemma find_nth_preds_rec_S: forall {A: Type} (pred: A -> Prop) z R n Rn,
find_nth_preds_rec pred z R (Some (n, Rn)) ->
find_nth_preds_rec pred (S z) R (Some (S n, Rn)).
(* Current not used. *)
Lemma find_nth_preds_rec_delete_nth: forall {A: Type} (pred: A -> Prop) z m R Rn,
(exists n, find_nth_preds_rec pred z (delete_nth m R) (Some (n, Rn))) ->
(exists n, find_nth_preds_rec pred z R (Some (n, Rn))).
(* Current not used. *)
Lemma find_nth_preds_delete_nth: forall {A: Type} (pred: A -> Prop) m R Rn,
(exists n, find_nth_preds pred (delete_nth m R) (Some (n, Rn))) ->
(exists n, find_nth_preds pred R (Some (n, Rn))).