Ltac hoist_later_in_pre :=
match goal with |- semax _ ?P _ _ =>
match P with
| context[@later] =>
let P' := strip1_later P in apply semax_pre0 with (|> P'); [solve [auto 50 with derives] | ]
| _ => apply semax_later_trivial
end
end.
Ltac type_of_field_tac :=
simpl;
repeat first [rewrite if_true by auto
| rewrite if_false by (let H:=fresh in intro H; inversion H)
| simpl; reflexivity].
Ltac simpl_tc_expr :=
match goal with |- context [tc_expr ?A ?B] =>
change (tc_expr A B) with (denote_tc_assert (typecheck_expr A B));
simpl typecheck_expr; simpl denote_tc_assert
end.

(* Specifications: *)
Lemma prop_and1 {A}{NA: NatDed A}:
forall P Q : Prop, P -> !!(P /\ Q) = !!Q.