Fixpoint rval_list (vl: list val) (rl: exprlist) : exprlist :=
  match vl, rl with
  | v1 :: vl', Econs r1 rl' => Econs (Eval v1 (typeof r1)) (rval_list vl' rl')
  | _, _ => Enil
  end.Inductive eval_simple_list': exprlist -> list val -> Prop :=
  | esrl'_nil:
      eval_simple_list' Enil nil
  | esrl'_cons: forall r rl v vl,
      eval_simple_rvalue e m r v ->
      eval_simple_list' rl vl ->
      eval_simple_list' (Econs r rl) (v :: vl).Inductive eval_simple_list': exprlist -> list val -> Prop :=
  | esrl'_nil:
      eval_simple_list' Enil nil
  | esrl'_cons: forall r rl v vl,
      eval_simple_rvalue e m r v ->
      eval_simple_list' rl vl ->
      eval_simple_list' (Econs r rl) (v :: vl).Inductive eval_simple_list': exprlist -> list val -> Prop :=
  | esrl'_nil:
      eval_simple_list' Enil nil
  | esrl'_cons: forall r rl v vl,
      eval_simple_rvalue e m r v ->
      eval_simple_list' rl vl ->
      eval_simple_list' (Econs r rl) (v :: vl).

(* Specifications: *)
Lemma eval_simple_list_implies: forall rl tyl vl, eval_simple_list e m rl tyl vl -> exists vl', cast_arguments m (rval_list vl' rl) tyl vl /\ eval_simple_list' rl vl'.
Lemma can_eval_simple_list: forall rl vl, eval_simple_list' rl vl -> forall tyl vl', cast_arguments m (rval_list vl rl) tyl vl' -> eval_simple_list e m rl tyl vl'.
Lemma eval_simple_list_implies: forall rl tyl vl, eval_simple_list e m rl tyl vl -> exists vl', cast_arguments m (rval_list vl' rl) tyl vl /\ eval_simple_list' rl vl'.
Lemma can_eval_simple_list: forall rl vl, eval_simple_list' rl vl -> forall tyl vl', cast_arguments m (rval_list vl rl) tyl vl' -> eval_simple_list e m rl tyl vl'.