The search misses nothing #
dfsNode_dom: every leaf of the whole tree that the search skipped was skipped for a reason,
so the leaf it finally holds is the best one.
The obstacle is that pruneNode may clear the incumbent (st.best := none) when the node's
invariant path already beats it. So "dominated by the incumbent" is not preserved into a recursive
call, and cannot be the invariant. The fix is to carry an extra predicate D — "already accounted
for by whoever called us" — and prove everything relative to
D is quantified inside the induction motive, so each recursive call may be made at a shifted
predicate DomD D st; Guar's BestMono st0 st component is exactly what lets the shift be
collapsed again on the way out (DomD.shift).
The other pieces:
Dchild— every leaf below a given child of the current node is accounted for.dchild_gensays this set is closed under automorphisms fixing the path, which is what makes orbit pruning sound.Guar— what a returning call promises: it never asks to jump above the node it was called at, every leaf below the depth it vouches for is accounted for, and it kept the incumbent it was given.guar_stop/guar_goare the two ways a child can come back.stopDepthmeasures how far down the returning state actually vouches for: the whole subtree if it returned normally, only the part above the backjump target if it asked to jump.
Dominated by the incumbent, or already accounted for by whoever called us.
Equations
- IsoGraph.Canon.DomD D st k = (IsoGraph.Canon.Dom st k ∨ D k)
Instances For
Every leaf below the child w is accounted for.
Equations
- IsoGraph.Canon.Dchild n f D invPath p st w = (w < n ∧ ∀ (k : List (List UInt64)), IsoGraph.Canon.SubR n f invPath p w k → IsoGraph.Canon.DomD D st k)
Instances For
Orbit pruning is sound. A generator fixing the path maps accounted-for children to
accounted-for children, because it carries the subtree below g w onto the subtree below w.
Small facts about unwind #
Small facts about the state #
The orbit cache #
What a returning call guarantees: it never asks to jump above the node it was called at, and
every leaf below the depth it vouches for is accounted for. st0 is the state it started from,
whose incumbent it never loses.
Equations
- One or more equations did not get rendered due to their size.
Instances For
A child that came back asking to jump above us: the request passes through unchanged.
A child that came back normally: everything below it is accounted for.