Documentation

HexGraphIso.Nauty.SmallCell.Flip

theorem Hex.GraphIso.Nauty.fixed_ne {α : Type} {f : αα} {z u v : α} (hz : f z = z) (hu : f u = v) (hne : u v) :
z u

A fixed point is distinct from either member of a nontrivial swap.

theorem Hex.GraphIso.Nauty.flip_iff {α : Type} {R : ααBool} {f : αα} {P : ααProp} (hsymm : ∀ (u v : α), R u v = R v u) (hswap : ∀ (u v : α), P u vf u = v f v = u) (hcover : ∀ (z : α), f z = z (u : α), (v : α), P u v (z = u z = v)) :
(∀ (z w : α), R (f z) (f w) = R z w) (∀ (z : α), f z = z∀ (u v : α), P u vR z u = R z v) ∀ (u v x y : α), P u vP x yR u x = R v y R u y = R v x

A map given by transpositions preserves adjacency exactly when fixed vertices see each pair alike and the adjacency between pairs agrees under simultaneous exchange. The cross conditions include a pair compared with itself, expressing equal loops and symmetry on that pair.

theorem Hex.GraphIso.Nauty.flip_bits {n : Nat} {ctx : Ctx n} {f : NatNat} {P : NatNatProp} (hsymm : ∀ (z w : Nat), z < nw < nctx.g[z]!.mem w = ctx.g[w]!.mem z) (hbound : ∀ (z : Nat), z < nf z < n) (hswap : ∀ (u v : Nat), P u vf u = v f v = u) (hcover : ∀ (z : Nat), z < nf z = z (u : Nat), (v : Nat), u < n v < n P u v (z = u z = v)) (hfix : ∀ (z : Nat), z < nf z = z∀ (u v : Nat), P u vctx.g[z]!.mem u = ctx.g[z]!.mem v) (hcross : ∀ (u v x y : Nat), P u vP x yctx.g[u]!.mem x = ctx.g[v]!.mem y ctx.g[u]!.mem y = ctx.g[v]!.mem x) (z w : Nat) :
z < nw < nctx.g[f z]!.mem (f w) = ctx.g[z]!.mem w

The transposition criterion on the bounded vertex indices of a graph.

theorem Hex.GraphIso.Nauty.mem_image_invol {n : Nat} {f : NatNat} {s : VSet n} (hfb : ∀ (v : Nat), v < nf v < n) (hinvol : ∀ (v : Nat), v < nf (f v) = v) {z : Nat} (hz : z < n) :
(VSet.image f s).mem z = s.mem (f z)

Image membership under a bounded involution reads off the preimage.

theorem Hex.GraphIso.Nauty.rows_of_bits {n : Nat} {ctx : Ctx n} {f : NatNat} (hfb : ∀ (v : Nat), v < nf v < n) (hinvol : ∀ (v : Nat), v < nf (f v) = v) (hbits : ∀ (z z' : Nat), z < nz' < nctx.g[f z]!.mem (f z') = ctx.g[z]!.mem z') (v : Nat) :
v < nctx.g[f v]! = VSet.image f ctx.g[v]!

Rows from value-level bit invariance.

Equations
Instances For
    theorem Hex.GraphIso.Nauty.sw1_lt {n u v : Nat} (hun : u < n) (hvn : v < n) (z : Nat) :
    z < nsw1 u v z < n
    theorem Hex.GraphIso.Nauty.sw1_u {u v : Nat} :
    sw1 u v u = v
    theorem Hex.GraphIso.Nauty.sw1_v {u v : Nat} (huv : u v) :
    sw1 u v v = u
    theorem Hex.GraphIso.Nauty.sw1_fix {u v z : Nat} (hzu : z u) (hzv : z v) :
    sw1 u v z = z
    theorem Hex.GraphIso.Nauty.sw1_invol {u v : Nat} (huv : u v) (z : Nat) :
    sw1 u v (sw1 u v z) = z
    theorem Hex.GraphIso.Nauty.sw1_bits {n : Nat} {ctx : Ctx n} {u v : Nat} (hsymm : ∀ (z w : Nat), z < nw < nctx.g[z]!.mem w = ctx.g[w]!.mem z) (hloop : ∀ (z : Nat), z < nctx.g[z]!.mem z = false) (hun : u < n) (hvn : v < n) (huv : u v) (hfix : ∀ (z : Nat), z < nz uz vctx.g[z]!.mem u = ctx.g[z]!.mem v) (z z' : Nat) :
    z < nz' < nctx.g[sw1 u v z]!.mem (sw1 u v z') = ctx.g[z]!.mem z'

    Bit invariance of a single swap: every other vertex has equal bits at the two swapped ones.

    def Hex.GraphIso.Nauty.sw2 (u v x y z : Nat) :
    Equations
    Instances For
      def Hex.GraphIso.Nauty.Sw2Ok (n u v x y : Nat) :

      The distinctness bundle of an active double swap.

      Equations
      Instances For
        theorem Hex.GraphIso.Nauty.sw2_u {u v x y : Nat} :
        sw2 u v x y u = v
        theorem Hex.GraphIso.Nauty.sw2_v {u v x y n : Nat} (h : Sw2Ok n u v x y) :
        sw2 u v x y v = u
        theorem Hex.GraphIso.Nauty.sw2_x {u v x y n : Nat} (h : Sw2Ok n u v x y) :
        sw2 u v x y x = y
        theorem Hex.GraphIso.Nauty.sw2_y {u v x y n : Nat} (h : Sw2Ok n u v x y) :
        sw2 u v x y y = x
        theorem Hex.GraphIso.Nauty.sw2_fix {u v x y z : Nat} (hzu : z u) (hzv : z v) (hzx : z x) (hzy : z y) :
        sw2 u v x y z = z
        theorem Hex.GraphIso.Nauty.sw2_lt {u v x y n : Nat} (h : Sw2Ok n u v x y) (z : Nat) :
        z < nsw2 u v x y z < n
        theorem Hex.GraphIso.Nauty.sw2_invol {u v x y n : Nat} (h : Sw2Ok n u v x y) (z : Nat) :
        sw2 u v x y (sw2 u v x y z) = z
        theorem Hex.GraphIso.Nauty.sw2_bits {n : Nat} {ctx : Ctx n} {u v x y : Nat} (hsymm : ∀ (z w : Nat), z < nw < nctx.g[z]!.mem w = ctx.g[w]!.mem z) (hloop : ∀ (z : Nat), z < nctx.g[z]!.mem z = false) (h : Sw2Ok n u v x y) (hfix : ∀ (z : Nat), z < nz uz vz xz yctx.g[z]!.mem u = ctx.g[z]!.mem v ctx.g[z]!.mem x = ctx.g[z]!.mem y) (hc1 : ctx.g[u]!.mem x = ctx.g[v]!.mem y) (hc2 : ctx.g[u]!.mem y = ctx.g[v]!.mem x) (z z' : Nat) :
        z < nz' < nctx.g[sw2 u v x y z]!.mem (sw2 u v x y z') = ctx.g[z]!.mem z'

        Bit invariance of a double swap: fixed vertices have equal bits at both swapped pairs, and the cross bits between the pairs match diagonally.

        def Hex.GraphIso.Nauty.sw3 (u v x y a b z : Nat) :
        Equations
        Instances For
          def Hex.GraphIso.Nauty.Sw3Ok (n u v x y a b : Nat) :

          The distinctness bundle of an active triple swap.

          Equations
          • One or more equations did not get rendered due to their size.
          Instances For
            theorem Hex.GraphIso.Nauty.sw3_u {u v x y a b : Nat} :
            sw3 u v x y a b u = v
            theorem Hex.GraphIso.Nauty.sw3_v {u v x y a b n : Nat} (h : Sw3Ok n u v x y a b) :
            sw3 u v x y a b v = u
            theorem Hex.GraphIso.Nauty.sw3_x {u v x y a b n : Nat} (h : Sw3Ok n u v x y a b) :
            sw3 u v x y a b x = y
            theorem Hex.GraphIso.Nauty.sw3_y {u v x y a b n : Nat} (h : Sw3Ok n u v x y a b) :
            sw3 u v x y a b y = x
            theorem Hex.GraphIso.Nauty.sw3_a {u v x y a b n : Nat} (h : Sw3Ok n u v x y a b) :
            sw3 u v x y a b a = b
            theorem Hex.GraphIso.Nauty.sw3_b {u v x y a b n : Nat} (h : Sw3Ok n u v x y a b) :
            sw3 u v x y a b b = a
            theorem Hex.GraphIso.Nauty.sw3_fix {u v x y a b z : Nat} (hzu : z u) (hzv : z v) (hzx : z x) (hzy : z y) (hza : z a) (hzb : z b) :
            sw3 u v x y a b z = z
            theorem Hex.GraphIso.Nauty.sw3_lt {u v x y a b n : Nat} (h : Sw3Ok n u v x y a b) (z : Nat) :
            z < nsw3 u v x y a b z < n
            theorem Hex.GraphIso.Nauty.sw3_invol {u v x y a b n : Nat} (h : Sw3Ok n u v x y a b) (z : Nat) :
            sw3 u v x y a b (sw3 u v x y a b z) = z
            theorem Hex.GraphIso.Nauty.sw3_bits {n : Nat} {ctx : Ctx n} {u v x y a b : Nat} (hsymm : ∀ (z w : Nat), z < nw < nctx.g[z]!.mem w = ctx.g[w]!.mem z) (hloop : ∀ (z : Nat), z < nctx.g[z]!.mem z = false) (h : Sw3Ok n u v x y a b) (hfix : ∀ (z : Nat), z < nz uz vz xz yz az bctx.g[z]!.mem u = ctx.g[z]!.mem v ctx.g[z]!.mem x = ctx.g[z]!.mem y ctx.g[z]!.mem a = ctx.g[z]!.mem b) (h1 : ctx.g[u]!.mem x = ctx.g[v]!.mem y) (h2 : ctx.g[u]!.mem y = ctx.g[v]!.mem x) (h3 : ctx.g[u]!.mem a = ctx.g[v]!.mem b) (h4 : ctx.g[u]!.mem b = ctx.g[v]!.mem a) (h5 : ctx.g[x]!.mem a = ctx.g[y]!.mem b) (h6 : ctx.g[x]!.mem b = ctx.g[y]!.mem a) (z z' : Nat) :
            z < nz' < nctx.g[sw3 u v x y a b z]!.mem (sw3 u v x y a b z') = ctx.g[z]!.mem z'

            A triple swap preserves every row when each swapped pair looks alike from outside and the three pairs cross each other coherently.

            theorem Hex.GraphIso.Nauty.sw2_comp {n u v x y : Nat} (h : Sw2Ok n u v x y) (z : Nat) :
            sw2 u v x y z = sw1 u v (sw1 x y z)

            Disjoint transpositions compose to the double swap.

            theorem Hex.GraphIso.Nauty.sw3_comp {n u v x y a b : Nat} (h : Sw3Ok n u v x y a b) (z : Nat) :
            sw3 u v x y a b z = sw2 u v x y (sw1 a b z)

            A disjoint double swap and transposition compose to the triple swap.

            theorem Hex.GraphIso.Nauty.cellsPerm_self_setwise {n : Nat} {lab ptn : Array Nat} {level : Nat} {σ : Renaming n} (hps : ptn.size = n) (hlsz : lab.size = n) (hend : ptn[ptn.size - 1]! level) (hinj : LabInj lab n) (hset : ∀ (p : Nat × Nat), p cells ptn level n∀ (o : Nat), o < p.snd + 1 - p.fst (o' : Nat), o' < p.snd + 1 - p.fst σ.toFun lab[p.fst + o]! = lab[p.fst + o']!) :
            cellsPerm ptn level lab (Array.map σ.toFun lab)

            A renaming permuting every cell's members within the cell is a cell-contents self-equivalence of the labelling.

            theorem Hex.GraphIso.Nauty.stPerm_self_setwise {n : Nat} {f : NatNat} {st : RefineSt n} {level : Nat} (hok : StOk n level st) (hinj : LabInj st.lab n) (hfb : ∀ (v : Nat), v < nf v < n) (hinvol : ∀ (v : Nat), v < nf (f v) = v) (hset : ∀ (p : Nat × Nat), p cells st.ptn level n∀ (o : Nat), o < p.snd + 1 - p.fst (o' : Nat), o' < p.snd + 1 - p.fst f st.lab[p.fst + o]! = st.lab[p.fst + o']!) :
            StPerm level st (mapSt (renamingOfFlip f n hfb hinvol) st)

            The setwise self-equivalence packaged as StPerm, for a raw involution.

            def Hex.GraphIso.Nauty.CellMap {n : Nat} (st : RefineSt n) (level : Nat) (f : NatNat) :

            A vertex map sends every cell into itself.

            Equations
            • One or more equations did not get rendered due to their size.
            Instances For
              theorem Hex.GraphIso.Nauty.CellMap.comp {n : Nat} {st : RefineSt n} {level : Nat} {f g : NatNat} (hf : CellMap st level f) (hg : CellMap st level g) :
              CellMap st level fun (v : Nat) => f (g v)

              Composing maps that preserve each cell preserves each cell.

              theorem Hex.GraphIso.Nauty.sw1_cells {n : Nat} {st : RefineSt n} {level c e a b : Nat} (hok : StOk n level st) (hinj : LabInj st.lab n) (hc : (c, e) cells st.ptn level n) (ha : a e - c) (hb : b e - c) (hab : a b) :
              CellMap st level (sw1 st.lab[c + a]! st.lab[c + b]!)

              Swapping two members of one cell preserves all cells.

              theorem Hex.GraphIso.Nauty.sw2_cells {n : Nat} {st : RefineSt n} {level u v x y : Nat} (h : Sw2Ok n u v x y) (h1 : CellMap st level (sw1 u v)) (h2 : CellMap st level (sw1 x y)) :
              CellMap st level (sw2 u v x y)

              A disjoint double swap preserves cells when its two swaps do.

              theorem Hex.GraphIso.Nauty.sw3_cells {n : Nat} {st : RefineSt n} {level u v x y a b : Nat} (h : Sw3Ok n u v x y a b) (h1 : CellMap st level (sw1 u v)) (h2 : CellMap st level (sw1 x y)) (h3 : CellMap st level (sw1 a b)) :
              CellMap st level (sw3 u v x y a b)

              A disjoint triple swap preserves cells when its three swaps do.

              theorem Hex.GraphIso.Nauty.flip_rows {n : Nat} {ctx : Ctx n} {lab ptn : Array Nat} {level : Nat} {S : NatProp} {f : NatNat} (hE : Equitable ctx level lab ptn) (hps : ptn.size = n) (hend : ptn[ptn.size - 1]! level) (hinj : ∀ (i j : Nat), i < nj < nlab[i]! = lab[j]!i = j) (hlb : ∀ (i : Nat), i < nlab[i]! < n) (hsurj : ∀ (v : Nat), v < n (i : Nat), i < n lab[i]! = v) (hsymm : ∀ (u w : Nat), u < nw < nctx.g[u]!.mem w = ctx.g[w]!.mem u) (_hloop : ∀ (v : Nat), v < nctx.g[v]!.mem v = false) (hfb : ∀ (v : Nat), v < nf v < n) (hinvol : ∀ (v : Nat), v < nf (f v) = v) (hSpair : ∀ (p : Nat × Nat), p cells ptn level nS p.fstp.snd = p.fst + 1) (hSswap : ∀ (p : Nat × Nat), p cells ptn level nS p.fstf lab[p.fst]! = lab[p.fst + 1]! f lab[p.fst + 1]! = lab[p.fst]!) (hSfix : ∀ (p : Nat × Nat), p cells ptn level n¬S p.fst∀ (o : Nat), o < p.snd + 1 - p.fstf lab[p.fst + o]! = lab[p.fst + o]!) (hSclosed : ∀ (p : Nat × Nat), p cells ptn level n∀ (q : Nat × Nat), q cells ptn level nS p.fstq.snd = q.fst + 1PairMatch ctx.g lab[p.fst]! lab[p.fst + 1]! lab[q.fst]! lab[q.fst + 1]!S q.fst) (hOdd : ∀ (q : Nat × Nat), q cells ptn level nq.snd q.fst + 1 → (q.snd + 1 - q.fst) % 2 = 1) (v : Nat) :
              v < nctx.g[f v]! = VSet.image f ctx.g[v]!

              The flip theorem: an involution swapping the vertices of a matching-closed set of pair cells and fixing every other vertex preserves the adjacency rows.

              theorem Hex.GraphIso.Nauty.triple_flip_rows {n : Nat} {ctx : Ctx n} {lab ptn : Array Nat} {level d : Nat} {f : NatNat} (hE : Equitable ctx level lab ptn) (hps : ptn.size = n) (hend : ptn[ptn.size - 1]! level) (hinj : ∀ (i j : Nat), i < nj < nlab[i]! = lab[j]!i = j) (hlb : ∀ (i : Nat), i < nlab[i]! < n) (hsurj : ∀ (v : Nat), v < n (i : Nat), i < n lab[i]! = v) (hsymm : ∀ (u w : Nat), u < nw < nctx.g[u]!.mem w = ctx.g[w]!.mem u) (hloop : ∀ (v : Nat), v < nctx.g[v]!.mem v = false) (hfb : ∀ (v : Nat), v < nf v < n) (hinvol : ∀ (v : Nat), v < nf (f v) = v) (hT : (d, d + 2) cells ptn level n) (hsmall : ∀ (q : Nat × Nat), q cells ptn level nq (d, d + 2)q.snd + 1 - q.fst 2) {a b : Nat} (ha : a < 3) (hb : b < 3) (hswap : f lab[d + a]! = lab[d + b]! f lab[d + b]! = lab[d + a]!) (hfix : ∀ (v : Nat), v < nv lab[d + a]!v lab[d + b]!f v = v) (v : Nat) :
              v < nctx.g[f v]! = VSet.image f ctx.g[v]!

              The triple flip theorem: the transposition of two triple members, fixing every other vertex, preserves the adjacency rows.

              theorem Hex.GraphIso.Nauty.triple_flip_data {n : Nat} {ctx : Ctx n} {st : RefineSt n} {level tc : Nat} (hIt : IterOk ctx level st) (hgsz : ctx.g.size = n) (hsymm : ∀ (u w : Nat), u < nw < nctx.g[u]!.mem w = ctx.g[w]!.mem u) (hloop : ∀ (v : Nat), v < nctx.g[v]!.mem v = false) (hE : Equitable ctx level st.lab st.ptn) (hT : (tc, tc + 2) cells st.ptn level n) (hsmall : ∀ (q : Nat × Nat), q cells st.ptn level nq (tc, tc + 2)q.snd + 1 - q.fst 2) {a b : Nat} (ha : a < 3) (hb : b < 3) (hab : a b) :
              (σ : Renaming n), RowsMap σ ctx.g ctx.g StPerm level st (mapSt σ st) st.lab[tc + b]! = σ.toFun st.lab[tc + a]!

              The flip data at a triple target: a row-preserving self-symmetry of the node carrying one child's individualized vertex to the other's.

              inductive Hex.GraphIso.Nauty.PairReach {n : Nat} (ctx : Ctx n) (lab ptn : Array Nat) (level t : Nat) :
              NatProp

              The PairMatch-reachability closure of a pair-cell start.

              Instances For
                theorem Hex.GraphIso.Nauty.cells_eq_of_start {ptn : Array Nat} {level nn : Nat} (hnn : nn ptn.size) (hend : ptn[ptn.size - 1]! level) {c e e' : Nat} (h1 : (c, e) cells ptn level nn) (h2 : (c, e') cells ptn level nn) :
                e = e'

                A cell is determined by its start.

                theorem Hex.GraphIso.Nauty.pair_start_ne_second {ptn : Array Nat} {level nn : Nat} (hnn : nn ptn.size) (hend : ptn[ptn.size - 1]! level) {c c' : Nat} (h1 : (c, c + 1) cells ptn level nn) (h2 : (c', c' + 1) cells ptn level nn) :
                c c' + 1

                A pair start is never another pair's second position.

                theorem Hex.GraphIso.Nauty.pairReach_pair {n : Nat} {ctx : Ctx n} {lab ptn : Array Nat} {level t c : Nat} (hroot : (t, t + 1) cells ptn level n) (h : PairReach ctx lab ptn level t c) :
                (c, c + 1) cells ptn level n

                Every member of the closure of a pair start is itself a pair-cell start.

                theorem Hex.GraphIso.Nauty.pair_cells_disj {ptn : Array Nat} {level nn : Nat} (hnn : nn ptn.size) (hend : ptn[ptn.size - 1]! level) {c c' : Nat} (h1 : (c, c + 1) cells ptn level nn) (h2 : (c', c' + 1) cells ptn level nn) (hne : c c') :
                c + 2 c' c' + 2 c

                Distinct closure pairs occupy disjoint positions.

                noncomputable def Hex.GraphIso.Nauty.pairFlip {n : Nat} (ctx : Ctx n) (lab ptn : Array Nat) (level t : Nat) :
                NatNat

                The involution swapping every pair in the PairReach closure of t: a vertex that is a member of a closure pair maps to its partner, and every other vertex is fixed.

                Equations
                • One or more equations did not get rendered due to their size.
                Instances For
                  theorem Hex.GraphIso.Nauty.pairFlip_first {n : Nat} {ctx : Ctx n} {lab ptn : Array Nat} {level t : Nat} (hpsz : ptn.size = n) (hend : ptn[ptn.size - 1]! level) (hinj : LabInj lab n) {c : Nat} (hr : PairReach ctx lab ptn level t c) (hcell : (c, c + 1) cells ptn level n) :
                  pairFlip ctx lab ptn level t lab[c]! = lab[c + 1]!

                  The flip carries a closure pair's first member to its second.

                  theorem Hex.GraphIso.Nauty.pairFlip_second {n : Nat} {ctx : Ctx n} {lab ptn : Array Nat} {level t : Nat} (hpsz : ptn.size = n) (hend : ptn[ptn.size - 1]! level) (hinj : LabInj lab n) {c : Nat} (hr : PairReach ctx lab ptn level t c) (hcell : (c, c + 1) cells ptn level n) :
                  pairFlip ctx lab ptn level t lab[c + 1]! = lab[c]!

                  The flip carries a closure pair's second member to its first.

                  theorem Hex.GraphIso.Nauty.pairFlip_fix {n : Nat} {ctx : Ctx n} {lab ptn : Array Nat} {level t v : Nat} (hnone : ∀ (c : Nat), PairReach ctx lab ptn level t c(c, c + 1) cells ptn level nv lab[c]! v lab[c + 1]!) :
                  pairFlip ctx lab ptn level t v = v

                  The flip fixes every vertex that is not a closure-pair member.

                  theorem Hex.GraphIso.Nauty.pairFlip_lt {n : Nat} {ctx : Ctx n} {lab ptn : Array Nat} {level t : Nat} (hpsz : ptn.size = n) (hlsz : lab.size = n) (hend : ptn[ptn.size - 1]! level) (hlb : LabOk lab n) {v : Nat} (hv : v < n) :
                  pairFlip ctx lab ptn level t v < n

                  The flip is bounded on the vertex range.

                  theorem Hex.GraphIso.Nauty.pairFlip_invol {n : Nat} {ctx : Ctx n} {lab ptn : Array Nat} {level t : Nat} (hpsz : ptn.size = n) (hend : ptn[ptn.size - 1]! level) (hinj : LabInj lab n) {v : Nat} :
                  pairFlip ctx lab ptn level t (pairFlip ctx lab ptn level t v) = v

                  The flip is an involution on the vertex range.

                  theorem Hex.GraphIso.Nauty.pairFlip_fix_cell {n : Nat} {ctx : Ctx n} {lab ptn : Array Nat} {level t : Nat} (hpsz : ptn.size = n) (hend : ptn[ptn.size - 1]! level) (hinj : LabInj lab n) {q : Nat × Nat} (hq : q cells ptn level n) (hnotS : ¬PairReach ctx lab ptn level t q.fst) {o : Nat} (ho : o < q.snd + 1 - q.fst) :
                  pairFlip ctx lab ptn level t lab[q.fst + o]! = lab[q.fst + o]!

                  A member of a cell outside the closure is fixed by the flip: its position would otherwise sit inside a closure pair's window.

                  theorem Hex.GraphIso.Nauty.pair_flip_data {n : Nat} {ctx : Ctx n} {st : RefineSt n} {level tc : Nat} (hIt : IterOk ctx level st) (hgsz : ctx.g.size = n) (hsymm : ∀ (u w : Nat), u < nw < nctx.g[u]!.mem w = ctx.g[w]!.mem u) (hloop : ∀ (v : Nat), v < nctx.g[v]!.mem v = false) (hE : Equitable ctx level st.lab st.ptn) (hP : (tc, tc + 1) cells st.ptn level n) (hOdd : ∀ (q : Nat × Nat), q cells st.ptn level nq.snd q.fst + 1 → (q.snd + 1 - q.fst) % 2 = 1) {a b : Nat} (ha : a < 2) (hb : b < 2) (hab : a b) :
                  (σ : Renaming n), RowsMap σ ctx.g ctx.g StPerm level st (mapSt σ st) st.lab[tc + b]! = σ.toFun st.lab[tc + a]!

                  The flip data at a pair target: a row-preserving self-symmetry of the node carrying one child's individualized vertex to the other's.

                  theorem Hex.GraphIso.Nauty.flip_data_of_bits {n : Nat} {ctx : Ctx n} {st : RefineSt n} {level : Nat} {f : NatNat} (hIt : IterOk ctx level st) (hgsz : ctx.g.size = n) (hfb : ∀ (w : Nat), w < nf w < n) (hinvol : ∀ (w : Nat), w < nf (f w) = w) (hbits : ∀ (z z' : Nat), z < nz' < nctx.g[f z]!.mem (f z') = ctx.g[z]!.mem z') (hset : ∀ (p : Nat × Nat), p cells st.ptn level n∀ (o : Nat), o < p.snd + 1 - p.fst (o' : Nat), o' < p.snd + 1 - p.fst f st.lab[p.fst + o]! = st.lab[p.fst + o']!) :
                  (σ : Renaming n), RowsMap σ ctx.g ctx.g StPerm level st (mapSt σ st) ∀ (i : Nat), i < nσ.toFun st.lab[i]! = f st.lab[i]!