Documentation

VerifiedCompiler.Denotational.Tactics

Tactics for discharging StrongRefinement obligations.

Every tactic here leaves goals rather than searching: the leaf discharge is sem_side's job, and a search tactic runs terminally or not at all.

The source matches the target's step: supply the source state it steps to, and — with the two-argument form — the source trace it emits. Leaves the post-relation, the obligation and the source-membership obligation, in that order.

The trace is a witness, not a goal, so it cannot be left as _: an existential's witness has to be a term by the time the body elaborates. The one-argument form therefore leaves it as the first goal, ahead of the three obligations; prefer the two-argument form wherever the emitted trace is already known, which for a trace-preserving pass is everywhere.

Equations
  • One or more equations did not get rendered due to their size.
Instances For

    The source aborted instead, having emitted ε. Leaves the ≼[Rτ] obligation and membership in the source's aborting semantics. Covers both Terminating's right disjunct and the whole of Aborting, which is the same shape without the Or.

    Equations
    • One or more equations did not get rendered due to their size.
    Instances For

      The source diverges too, emitting εDiverging's left disjunct. Its right disjunct is an abort, which refines_abort already covers.

      Equations
      • One or more equations did not get rendered due to their size.
      Instances For

        Close a Rτ ε' ε goal when the two traces are literally the same and is reflexive at it — the shape a trace-preserving pass produces at every leaf. Falls back to an assumption, for a pass carrying the relatedness as a hypothesis.

        Equations
        Instances For

          Close a ε' ≼[Rτ] ε goal the same way: ≼[·] is extensive with no hypotheses on the relation, so a related pair is a prefix pair (Trace.scPrefix_of).

          Equations
          Instances For

            Validation #

            Two examples, one per disjunct, against the identity refinement — enough to catch the failure mode these macros exist to prevent: a refine whose ?_ count or order drifts from the definition it targets. They are cheap and they break loudly if Terminating/Aborting change shape.