(* Copyright (C) 2012  G. Gonthier, B. Ziliani, A. Nanevski, D. Dreyer  This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.  This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.  You should have received a copy of the GNU General Public License along with this program.  If not, see <http://www.gnu.org/licenses/>. *)
From mathcomp
Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.
(***********************************)
(* option lookup and list prefixes *)
(***********************************)
Section Prefix.
Variable A : Type.
Fixpoint onth (s : seq A) n : option A :=
if s is x :: s' then
if n is n'.+1 then onth s' n' else Some x
else None.
Definition prefix s1 s2 :=
forall n x, onth s1 n = some x -> onth s2 n = some x.

(* Specifications: *)
Lemma size_onth (s : seq A) n : n < size s -> exists x, onth s n = Some x.
Lemma onth_size (s : seq A) n x : onth s n = Some x -> n < size s.
Lemma prefix_size (s t : seq A) : prefix s t -> size s <= size t.
Lemma prefix_onth (s t : seq A) x : x < size s -> prefix s t -> onth s x = onth t x.
End Prefix.