Definition super_non_expansive' {A} P := forall n ts x, compcert_rmaps.RML.R.approx n (P ts x) =
compcert_rmaps.RML.R.approx n (P ts (functors.MixVariantFunctor.fmap (rmaps.dependent_type_functor_rec ts A)
(compcert_rmaps.RML.R.approx n) (compcert_rmaps.RML.R.approx n) x)).

(* Specifications: *)
Lemma approx_sepcon_list: forall n lP, lP <> [] ->
compcert_rmaps.RML.R.approx n (fold_right sepcon emp lP) =
fold_right sepcon emp (map (compcert_rmaps.RML.R.approx n) lP).
Corollary approx_sepcon_list' : forall n lP P,
compcert_rmaps.RML.R.approx n (fold_right sepcon emp lP)  * compcert_rmaps.RML.R.approx n P =
fold_right sepcon emp (map (compcert_rmaps.RML.R.approx n) lP) * compcert_rmaps.RML.R.approx n P.
Lemma approx_FF : forall n, compcert_rmaps.RML.R.approx n FF = FF.
Lemma later_nonexpansive : nonexpansive (@later mpred _ _).
Lemma eqp_refl : forall (G : Triv) P, G |-- P <=> P.
Lemma eqp_sepcon : forall (G : Triv) (P P' Q Q' : mpred)
(HP : G |-- P <=> P') (HQ : G |-- Q <=> Q'), G |-- P * Q <=> P' * Q'.
Lemma eqp_andp : forall (G : Triv) (P P' Q Q' : mpred)
(HP : G |-- P <=> P') (HQ : G |-- Q <=> Q'), G |-- P && Q <=> P' && Q'.
Lemma eqp_exp : forall (A : Type) (NA : NatDed A) (IA : Indir A) (RecIndir : RecIndir A)
(G : Triv) (B : Type) (X Y : B -> A),
(forall x : B, G |-- X x <=> Y x) ->
G |-- (EX x : _, X x) <=> (EX x : _, Y x).
Lemma fold_right_sepcon_nonexpansive : forall lP1 lP2, Zlength lP1 = Zlength lP2 ->
(ALL i : Z, Znth i lP1 <=> Znth i lP2) |--
fold_right sepcon emp lP1 <=> fold_right sepcon emp lP2.
(* tactics *)
Lemma void_ret : ifvoid tvoid (` (PROP ( )  LOCAL ()  SEP ()) (make_args [] []))
(EX v : val, ` (PROP ( )  LOCAL ()  SEP ()) (make_args [ret_temp] [v])) = emp.