Ltac refold_right_sepcon R :=
 match R with
 | @sepcon mpred _ _ ?R1 ?R' => let S := refold_right_sepcon R' in constr: (R1 :: S )
 | _ => constr:(R :: nil)
 end.Definition func_ptr' f v := func_ptr f v && emp.

(* Specifications: *)
Lemma split_func_ptr': forall fs p, func_ptr' fs p = func_ptr' fs p * func_ptr' fs p.
Lemma approx_func_ptr': forall (A: Type) fsig0 cc (P Q: A -> environ -> mpred) (v: val) (n: nat), compcert_rmaps.RML.R.approx n (func_ptr' (NDmk_funspec fsig0 cc A P Q) v) = compcert_rmaps.RML.R.approx n (func_ptr' (NDmk_funspec fsig0 cc A (fun a rho => compcert_rmaps.RML.R.approx n (P a rho)) (fun a rho => compcert_rmaps.RML.R.approx n (Q a rho))) v).
Lemma lift0_unfold: forall {A} (f: A) rho, lift0 f rho = f.
Lemma lift1_unfold: forall {A1 B} (f: A1 -> B) a1 rho, lift1 f a1 rho = f (a1 rho).
Lemma lift2_unfold: forall {A1 A2 B} (f: A1 -> A
Proof. reflexivity. Qed.
`f a1 a2 a3 rho = f (a1 rho) (a2 rho) (a3 rho). Proof. reflexivity. Qed.
Hint Rewrite @lift0_unfold @lift1_unfol
Proof. intros. extensionality rho; reflexivity.
Qed. Hint Rewrite @subst_lift0 (*@subst_lift0'*) @subst_lift0C
Proof. intros. extensionality rho; reflexivity. Qed.
Qed. Hint Rewrite @subst_lift1 (*@subst_lift1'*) @subst_lift1C : subst.
Proof. intros. extensionality rho; reflexivity. Qed.
Qed. Hint Rewrite @subst_lift2 (*@subst_lift2'*) @subst_lift2C : subst.
Proof. intros. extensionality rho; reflexivity. Qed.
Qed. Hint Rewrite @subst_lift3 (*@subst_lift3'*) @subst_lift3C : subst.
Proof. intros. extensionality rho; reflexivity. Qed.
Hint Rewrite @subst_lift4 (*@subst_lift4'*) @subst_lift4C : subst.
simpl in H0; unfold Vfalse in H0. inv H0. inv H2. + unfold Val.of_bool in H. destruct (Int.eq i j); inv H. Qed. Lemma bool_val_notbool_p