Tactics like these from PLF:
From Hoare.v:
Ltac assertion_auto :=
try auto; (* as in example 1, above *)
try (unfold "->>", assertion_sub, t_update;
intros; simpl in *; lia). (* as in example 2 *)
From Hoare2.v:
Ltac verify_assertion :=
repeat split;
simpl;
unfold assert_implies;
unfold bassertion in *; unfold beval in *; unfold aeval in *;
unfold assertion_sub; intros;
repeat (simpl in *;
rewrite t_update_eq ||
(try rewrite t_update_neq;
[| (intro X; inversion X; fail)]));
simpl in *;
repeat match goal with [H : _ /\ _ |- _] =>
destruct H end;
repeat rewrite not_true_iff_false in *;
repeat rewrite not_false_iff_true in *;
repeat rewrite negb_true_iff in *;
repeat rewrite negb_false_iff in *;
repeat rewrite eqb_eq in *;
repeat rewrite eqb_neq in *;
repeat rewrite leb_iff in *;
repeat rewrite leb_iff_conv in *;
try subst;
simpl in *;
repeat
match goal with
[st : state |- _] =>
match goal with
| [H : st _ = _ |- _] =>
rewrite -> H in *; clear H
| [H : _ = st _ |- _] =>
rewrite <- H in *; clear H
end
end;
try eauto;
try lia.
Ltac verify :=
intros;
apply verification_correct;
verify_assertion.
Tactics like these from PLF:
From Hoare.v:
From Hoare2.v: