Fixpoint sem_rec1
  (g h:BC)(v : bs)(vnl vsl : list bs) {struct v} :=
  match v with
    | nil => sem g vnl vsl
    | _::v' => sem h (v::vnl) (sem_rec1 g h v' vnl vsl :: vsl)
  end.

(* Specifications: *)
Lemma rec1_correct n s g h vnl vsl : length vnl = S n -> length vsl = s -> sem (rec1 n s g h) vnl vsl = sem_rec1 g h (hd nil vnl) (tl vnl) vsl.