Module Junk.   (* experiments, not necessarily useful *)
Definition subsume_funspec0 (f1 f2 : funspec) :=
match f1 with
| mk_funspec fsig1 cc1 A1 P1 Q1 _ _ =>
match f2 with
| mk_funspec fsig2 cc2 A2 P2 Q2 _ _ =>
fsig1 = fsig2 /\ cc1 = cc2 /\
forall ts2 x2,
exists ts1 x1,
P2 ts2 x2 |-- P1 ts1 x1 /\
Q1 ts1 x1 |-- Q2 ts2 x2
end end.
Definition subsume_funspec' (f1 f2 : funspec) :=
match f1 with
| mk_funspec fsig1 cc1 A1 P1 Q1 _ _ =>
match f2 with
| mk_funspec fsig2 cc2 A2 P2 Q2 _ _ =>
fsig1 = fsig2 /\ cc1 = cc2 /\
forall ts2 x2, exists ts1,
P2 ts2 x2 |-- EX x1:_,
((P1 ts1 x1) &&
(!! (Q1 ts1 x1 |-- Q2 ts2 x2)))
end end.

(* Specifications: *)
Lemma subsume_semax_body:
forall fs1 fs2 (H: subsume_funspec0 fs1 fs2),
forall Vprog Gprog cs f id,
@semax_body Vprog Gprog cs f (id,fs1) ->
@semax_body Vprog Gprog cs f (id,fs2).
Lemma subsume_semax_body':
forall fs1 fs2 (H: subsume_funspec' fs1 fs2),
forall Vprog Gprog cs f id,
@semax_body Vprog Gprog cs f (id,fs1) ->
@semax_body Vprog Gprog cs f (id,fs2).