Module ConseqFacts :=
SeparationLogicFacts.GenConseqFacts
(SeparationLogicAsLogicSoundness.MainTheorem.CSHL_PracticalLogic.CSHL_MinimumLogic.CSHL_Def)
(Conseq).
(* OLD VERSION: Lemma semax_post': forall R' Espec {cs: compspecs} Delta R P c, R' |-- R -> @semax cs Espec Delta P c (normal_ret_assert R') -> @semax cs Espec Delta P c (normal_ret_assert R). *)
intros.
destruct Q as [?Q ?Q ?Q ?Q].
eapply semax_post; eauto; intros; apply andp_left2; simpl; auto; normalize.
Qed.

Lemma semax_frame_seq:
forall {Espec: OracleKind} {cs: compspecs} QFrame Frame Delta
P Q c1 c2 R P1 Q1 R1 P2 Q2 R2 R3,
semax Delta (PROPx P1 (LOCALx Q1 (SEPx R1))) c1
(normal_ret_assert (PROPx P2 (LOCALx Q2 (SEPx R2)))) ->
ENTAIL Delta, PROPx P (LOCALx Q (SEPx R)) |--
PROPx P1 (LOCALx (Q1++QFrame) (SEPx (R1 ++ Frame))) ->
closed_wrt_modvars c1 (LOCALx QFrame (SEPx Frame)) ->
semax Delta
(PROPx P2 (LOCALx (Q2++QFrame) (SEPx (R2 ++ Frame)))) c2 R3 ->
semax Delta (PROPx P (LOCALx Q (SEPx R))) (Ssequence c1 c2) R3.