Ltac semax_func_cons_ext :=
eapply semax_func_cons_ext;
[ reflexivity | reflexivity | reflexivity | reflexivity | reflexivity
| semax_func_cons_ext_tc;
try solve [apply typecheck_return_value; auto]
| solve[ first [eapply semax_ext;
[ (*repeat first [reflexivity | left; reflexivity | right]*) apply from_elements_In; reflexivity
| apply compute_funspecs_norepeat_e; reflexivity
| reflexivity
| reflexivity ]]]
|| fail "Try 'eapply semax_func_cons_ext.'"
"To solve [semax_external] judgments, do 'eapply semax_ext.'"
"Make sure that the Espec declared using 'Existing Instance'
is defined as 'add_funspecs NullExtension.Espec Gprog.'"
|
].
Tactic Notation "forward_seq" :=
first [eapply semax_seq'; [  | abbreviate_semax ]
| eapply semax_post_flipped' ].
Tactic Notation "forward_seq" constr(R) :=
match goal with P := @abbreviate ret_assert _ |- semax _ _ _ ?P' =>
constr_eq P P'; unfold abbreviate in P; subst P;
first [apply semax_seq with R; abbreviate_semax
| apply (semax_post_flipped' R); [abbreviate_semax | ]]
end.
(* old: Ltac forward_seq := first [eapply semax_seq'; [  | abbreviate_semax ] | eapply semax_post_flipped' ]. *)
(* end of "stuff to move elsewhere" *)

(* Specifications: *)
Lemma local_True_right:
forall (P: environ -> mpred),
P |-- local (`True).
Lemma force_val_sem_cast_neutral_isptr:
forall v,
isptr v ->
Some (force_val (sem_cast_pointer v)) = Some v.
Lemma prop_Forall_cons:
forall {B}{A} {NB: NatDed B} (P: B) F (a:A) b,
P |-- !! F a && !! Forall F b ->
P |-- !! Forall F (a::b).
Lemma prop_Forall_cons':
forall {B}{A} {NB: NatDed B} (P: B) P1 F (a:A) b,
P |-- !! (P1 /\ F a) && !! Forall F b ->
P |-- !! P1 && !! Forall F (a::b).
Lemma prop_Forall_nil:
forall {B}{A} {NB: NatDed B} (P: B)  (F: A -> Prop),
P |-- !! Forall F nil.
Lemma prop_Forall_nil':
forall {B}{A} {NB: NatDed B} (P: B)  P1 (F: A -> Prop),
P |-- !! P1->
P |-- !! P1 && !! Forall F nil.
Lemma prop_Forall_cons1:
forall {B}{A} {NB: NatDed B} (P: B) (F: A -> Prop) (a:A) b,
F a ->
P |-- !! Forall F b ->
P |-- !! Forall F (a::b).