intros.
apply (rel_LR'_sch _ rho phi
(fun e v => forall v', rel_expr' rho phi e v' -> v=v')
(fun e v => forall v', rel_lvalue' rho phi e v' -> v=v'));
auto; intros;
try match goal with H : _ |- _ => inv H; auto; try congruence end;
try match goal with H: rel_lvalue' _ _ _ _ |- _ => solve [inv H] end.
* (* Eunop *)
specialize (H0 _ H7). specialize (H8 Mem.empty). congruence.
* (* Ebinop *)
specialize (H0 _ H10). specialize (H2 _ H12).
specialize (H4 Mem.empty). specialize (H14 Mem.empty).
congruence.
* (* Ecast *)
specialize (H0 _ H5). specialize (H1 Mem.empty). congruence.
*  inversion2 H H6.
specialize (H1 _ H7).
subst v0.   clear H0 H7.
generalize H2; intros [wx [wy [_ [? _]]]].
unfold mapsto in *.
destruct (access_mode (typeof a)); try contradiction.
destruct (type_is_volatile (typeof a)); try contradiction.
destruct v1; try contradiction.
rewrite if_true in H0, H2, H8 by auto.
destruct H0 as [[? ?]|[? ?]]; [ |  hnf in H0; contradiction].
clear H1.
rewrite distrib_orp_sepcon in H2, H8.
destruct H2 as [H2 |[? [? [? [[Hx _] _]]]]]; [ | hnf in Hx; contradiction].
destruct H8 as [H8 |[? [? [? [[Hx _] _]]]]]; [ | hnf in Hx; contradiction].
autorewrite with normalize in H2, H8; auto with typeclass_instances.
destruct H8.
eapply res_predicates.address_mapsto_fun; split; eauto.
*
specialize (H0 _ H8). congruence.
Qed.

(* Specifications: *)
Lemma rel_expr'_fun:
forall {CS: compspecs} rho phi e v v', rel_expr' rho phi e v -> rel_expr' rho phi e v' -> v=v'.
Lemma rel_lvalue'_fun:
forall {CS: compspecs} rho phi e v v', rel_lvalue' rho phi e v -> rel_lvalue' rho phi e v' -> v=v'.
Lemma rel_LR_extend:
forall {CS: compspecs} e v rho w,
(rel_expr' rho w e v -> forall w', extendM w w' -> rel_expr' rho w' e v) /\
(rel_lvalue' rho w e v -> forall w', extendM w w' -> rel_lvalue' rho w' e v).
Lemma rel_expr_extend:
forall {CS: compspecs} e v rho, boxy extendM (rel_expr e v rho).
Lemma rel_lvalue_extend:
forall {CS: compspecs} e v rho, boxy extendM (rel_lvalue e v rho).