Fixpoint Sem (e: Cobham) (vl:list bs) : bs :=
  match e with
  | Zero => nil
  | Proj n j => nth j vl nil
  | Succ b => b :: hd nil vl
  | Smash => smash_bs (hd nil vl) (hd nil (tl vl))
  | Rec g h0 h1 j =>  
    sem_Rec (Sem g) (Sem h0) (Sem h1) (hd nil vl) (tail vl)
  | Comp _ h l => Sem h (List.map (fun e => Sem e vl) l)
  end.

(* Specifications: *)
Lemma simpl_Rec : forall g h0 h1 j l, Sem (Rec g h0 h1 j) l = sem_Rec (Sem g) (Sem h0) (Sem h1) (hd nil l) (tl l).
Lemma Sem_add_zero : forall e n, arity e = ok_arity n -> forall l, length l <= n -> Sem e l = Sem e (l ++ (map (fun e => nil) (seq 0 (n - length l)))).
Lemma Sem_remove_zero : forall e n, arity e = ok_arity n -> forall l l', n = length l -> Sem e l = Sem e (l ++ l').