Ltac field_address_assumption :=
match goal with
|  H: ?a = field_address _ _ _ |- ?b = _ => constr_eq a b; simple eapply H
end.
(* Ltac cleanup_int_signed_or_unsigned := match goal with |- context [int_signed_or_unsigned ?t (Int.repr ?i)] => (change (int_signed_or_unsigned t) with Int.signed; rewrite ?(Int.signed_repr i) by insist_rep_omega) ||   (change (int_signed_or_unsigned t) with Int.unsigned; rewrite ?(Int.unsigned_repr i) by insist_rep_omega) end. *)
Ltac solve_field_address_gen :=
(* repeat cleanup_int_signed_or_unsigned; *)
solve [
repeat
first
[ simple apply field_address_gen_nil; [reflexivity |]
| simple apply field_address_gen_app; [reflexivity |]
| simple eapply field_address_gen_assu; [field_address_assumption |]
| simple apply field_address_gen_refl
]
].
Inductive find_type_contradict_pred {cs: compspecs} (t: type) (p: val): mpred -> Prop :=
| find_type_contradict_pred_data_at: forall sh t0 v0, eqb_type t0 t = false -> find_type_contradict_pred t p (data_at sh t0 v0 p)
| find_type_contradict_pred_data_at_: forall sh t0, eqb_type t0 t = false -> find_type_contradict_pred t p (data_at_ sh t0 p)
| find_type_contradict_pred_field_at: forall sh t0 v0, eqb_type t0 t = false -> find_type_contradict_pred t p (field_at sh t0 nil v0 p)
| find_type_contradict_pred_field_at_: forall sh t0, eqb_type t0 t = false -> find_type_contradict_pred t p (field_at_ sh t0 nil p).
Definition find_type_contradict_preds {cs: compspecs} (t: type) (p: val) :=
find_nth_preds (find_type_contradict_pred t p).

(* Specifications: *)
Lemma SEP_type_contradict_lemma: forall {cs: compspecs} Delta e R goal Q T1 T2 GV e_root efs lr p_full_from_e p_root_from_e gfs_from_e t_root_from_e p_root_from_hint gfs_from_hint t_root_from_hint
mm1 mm2,
local2ptree Q = (T1, T2, nil, GV) ->
compute_nested_efield e = (e_root, efs, lr) ->
msubst_eval_lvalue Delta T1 T2 GV e = Some p_full_from_e ->
msubst_eval_LR Delta T1 T2 GV e_root lr = Some p_root_from_e ->
msubst_efield_denote Delta T1 T2 GV efs gfs_from_e ->
compute_root_type (typeof e_root) lr t_root_from_e ->
field_address_gen (t_root_from_e, gfs_from_e, p_root_from_e) (t_root_from_hint, gfs_from_hint, p_root_from_hint) ->
find_type_contradict_preds (typeof e) p_full_from_e R mm1 ->
(gfs_from_hint = nil /\ find_type_contradict_preds t_root_from_hint p_root_from_hint R mm2 \/ mm2 = None) ->
mm1 = mm2 /\ False ->
goal.