(** Safe expressions are well-formed with respect to l-values and r-values. *)
Definition expr_kind (a: expr) : kind :=
match a with
| Eloc _ _ _ => LV
| Evar _ _ => LV
| Ederef _ _ => LV
| Efield _ _ _ => LV
| _ => RV
end.

(* Specifications: *)
Lemma lred_kind:
forall e a m a' m', lred ge e a m a' m' -> expr_kind a = LV.
Lemma rred_kind:
forall a m t a' m', rred ge a m t a' m' -> expr_kind a = RV.
Lemma callred_kind:
forall a m fd args ty, callred ge a m fd args ty -> expr_kind a = RV.
Lemma context_kind:
forall a from to C, context from to C -> expr_kind a = from -> expr_kind (C a) = to.
Lemma imm_safe_kind:
forall e k a m, imm_safe ge e k a m -> expr_kind a = k.
Lemma safe_expr_kind:
forall from C f a k e m,
context from RV C ->
safe (ExprState f (C a) k e m) ->
expr_kind a = from.
Lemma lred_kind:
forall e a m a' m', lred ge e a m a' m' -> expr_kind a = LV.
Lemma rred_kind:
forall a m t a' m', rred ge a m t a' m' -> expr_kind a = RV.
Lemma callred_kind:
forall a m fd args ty, callred ge a m fd args ty -> expr_kind a = RV.
Lemma context_kind:
forall a from to C, context from to C -> expr_kind a = from -> expr_kind (C a) = to.
Lemma imm_safe_kind:
forall e k a m, imm_safe ge e k a m -> expr_kind a = k.
Lemma safe_expr_kind:
forall from C f a k e m,
context from RV C ->
safe (ExprState f (C a) k e m) ->
expr_kind a = from.