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).

(* 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'.