Proof Automation
The previous parts made proofs shorter and reusable: backward tactics decompose a stated goal, operations package one resource transformation each, and capsules carry code together with its proof. What none of them changed is who does the work: at every program point, a person still decides which memory cell matches which, which list to unfold before a read, and which equation remains to be proved. Watch a few of these proofs side by side and the same moves repeat — pair up the data_atdata_at of each program variable, unfold a list node, fold it back, and finish with a small list equation or an integer bound.
This part of the tutorial automates that routine.
Purifying Entailments with Strategies automates the spatial half. It introduces strategies — declarative rules describing how a predicate like sllsll is unfolded, folded, and canceled — and the tactic PURIFY_TACPURIFY_TAC that applies them until an entailment contains no spatial resources, plus POST_PURIFY_TACPOST_PURIFY_TAC, which converts the purified goal into an ordinary logic formula. The same strategies also customize how the symbolic execution engine performs frame inference at memory reads and writes, and the section closes with strategies for array predicates.
Closing Pure Goals with SMT automates the pure half. It connects C*‘s proof layer to the Z3 SMT solver: SMT_TACSMT_TAC closes ordinary logic goals, smt_add_axiomsmt_add_axiom supplies the solver with proved list theorems as background knowledge, and a short look inside term_to_z3term_to_z3 shows how HOL terms are translated — and where the translation stops. Together with purification this yields the three-step solve_vc_autosolve_vc_auto, demonstrated on the reversal and array examples end to end.