theorem
Hex.GraphIso.Nauty.Sparse.breakout_node
{n level numcells tc len o : Nat}
{lab ptn : Array Nat}
{active : VSet n}
(hp : lab.toList.Perm (List.range n))
(h : NodeOk n level lab ptn active)
(hc : numcells = bcount ptn level n)
(hl : level ≤ numcells)
(ht : IsCell ptn level tc len)
(hr : tc + len ≤ n)
(hn : 1 < len)
(ho : o < len)
:
Every target member increases the accurate count by one and preserves the node invariants and depth bound used to exhaust the unpruned tree.
theorem
Hex.GraphIso.Nauty.Sparse.specLeaves_succ
{n : Nat}
(G : SparseGraph n)
(tcLevel fuel level : Nat)
(lab ptn : Array Nat)
(active : VSet n)
(numcells : Nat)
(hp : lab.toList.Perm (List.range n))
(h : NodeOk n level lab ptn active)
(hc : numcells = bcount ptn level n)
(hl : level ≤ numcells)
(hf : n < fuel + numcells)
:
specLeaves G tcLevel (fuel + 1) level lab ptn active numcells = specLeaves G tcLevel fuel level lab ptn active numcells
Increasing an already sufficient recursion bound changes no leaf. The induction covers every target member, so no branch is silently truncated.
theorem
Hex.GraphIso.Nauty.Sparse.specLeaves_add
{n : Nat}
(G : SparseGraph n)
(tcLevel fuel extra level : Nat)
(lab ptn : Array Nat)
(active : VSet n)
(numcells : Nat)
(hp : lab.toList.Perm (List.range n))
(h : NodeOk n level lab ptn active)
(hc : numcells = bcount ptn level n)
(hl : level ≤ numcells)
(hf : n < fuel + numcells)
:
specLeaves G tcLevel (fuel + extra) level lab ptn active numcells = specLeaves G tcLevel fuel level lab ptn active numcells
Every larger recursion bound enumerates exactly the same complete tree.