Library Coq.setoid_ring.BinList


Require Import BinPos.
Require Export List.
Require Export ListTactics.
Open Local Scope positive_scope.

Section MakeBinList.
 Variable A : Type.
 Variable default : A.

 Fixpoint jump (p:positive) (l:list A) {struct p} : list A :=
  match p with
  | xH => tail l
  | xO p => jump p (jump p l)
  | xI p => jump p (jump p (tail l))
  end.

 Fixpoint nth (p:positive) (l:list A) {struct p} : A:=
  match p with
  | xH => hd default l
  | xO p => nth p (jump p l)
  | xI p => nth p (jump p (tail l))
  end.

 Lemma jump_tl : forall j l, tail (jump j l) = jump j (tail l).

 Lemma jump_Psucc : forall j l,
  (jump (Psucc j) l) = (jump 1 (jump j l)).

 Lemma jump_Pplus : forall i j l,
  (jump (i + j) l) = (jump i (jump j l)).

 Lemma jump_Pdouble_minus_one : forall i l,
  (jump (Pdouble_minus_one i) (tail l)) = (jump i (jump i l)).

 Lemma nth_jump : forall p l, nth p (tail l) = hd default (jump p l).

 Lemma nth_Pdouble_minus_one :
  forall p l, nth (Pdouble_minus_one p) (tail l) = nth p (jump p l).

End MakeBinList.