Documentation

LeanPool.IsoGraph.Canon.Node

Nodes of the search tree #

dfsNode carries three arguments that are only meaningful together: the array path of the vertices individualised so far, the invariant path invPath, and the current partition p. Node n f path invPath p is the ghost relation saying that these three really do come from individualising path from the root, in order.

It packages the facts that the recursion needs about a node it is sitting at:

Nodes of the search tree #

inductive IsoGraph.Canon.Node (n : ) (f : Bool) :

Node n f path invPath p says that the search reaches the node (invPath, p) by individualising the vertices of path, in order. It is the ghost information that ties together the three arguments path, invPath and p of dfsNode.

Instances For
    theorem IsoGraph.Canon.Node.wf {n : } {f : Bool} {path : Array } {invPath : Array UInt64} {p : Part} (h : Node n f path invPath p) :
    theorem IsoGraph.Canon.Node.path_lt {n : } {f : Bool} {path : Array } {invPath : Array UInt64} {p : Part} (h : Node n f path invPath p) (i : ) :
    i < path.sizepath[i]! < n
    theorem IsoGraph.Canon.Node.reach {n : } {f : Bool} {path : Array } {invPath : Array UInt64} {p : Part} (h : Node n f path invPath p) {k : List (List UInt64)} (hk : Reach n f invPath p k) :
    Leafkey n f k

    Every leaf below a node of the tree is a leaf of the whole tree.

    theorem IsoGraph.Canon.Node.auto_partEquiv {n : } {f : Bool} {path : Array } {invPath : Array UInt64} {p : Part} (h : Node n f path invPath p) {g : Array } (hg : IsAutoArr n f g) (hfix : i < path.size, g[path[i]!]! = path[i]!) :
    PartEquiv n (fun (x : ) => g[x]!) p p

    The partition at a node is invariant under any automorphism fixing its path. This is what makes orbit pruning legitimate: usableAutos keeps exactly the automorphisms fixing path.