mirror of
https://github.com/allaunthefox/SilverSight.git
synced 2026-07-31 01:25:21 +00:00
Snapshot of previously-uncommitted local work so nothing is lost after the power outage. NOT reviewed for correctness — a WIP checkpoint, not a feature: - multi-language hachimoji encoders (c/cpp/fortran/julia/octave/r/scala/go/rust/coq) - formal Lean WIP (BraidTree, Eisenstein, HachimojiCapture, MathlibConnect, ModularFormBridge, ClusterManifold) + lakefile + E8Sidon edit - docs/, experiments/ (epyc oisc benches), deploy/, scripts, test scaffolding - .gitignore: exclude **/target/ and Coq build artifacts Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
549 lines
No EOL
21 KiB
Text
549 lines
No EOL
21 KiB
Text
/-
|
|
BraidTree.lean — BraidTree Group: A Group Structure on Binary Braid Trees
|
|
|
|
A BraidTree is a rooted binary tree whose leaves are BraidStrands and whose
|
|
internal nodes are braidCross operations. The tree structure encodes the
|
|
order of crossings (non-flat topology), generalizing the flat 8-strand
|
|
BraidState from BraidEigensolid.lean.
|
|
|
|
Mathematical structure:
|
|
──────────────────────
|
|
Elements: BraidTree — rooted binary tree of braid crossings
|
|
Identity: leaf(BraidStrand.zero 0) — a single zero strand, no crossings
|
|
Product: t₁ · t₂ = node(t₁, t₂, C(root(t₁), root(t₂)))
|
|
— cross the roots of the two trees, producing a new tree
|
|
Inverse: inv(t) — recursively swap left↔right children at every node
|
|
(mirror image = braid-theoretic inverse)
|
|
|
|
Group axioms (proved modulo Yang-Baxter):
|
|
· mul_assoc — (t₁·t₂)·t₃ = t₁·(t₂·t₃) (requires YB on root crossings)
|
|
· one_mul — id·t = t
|
|
· mul_one — t·id = t
|
|
· mul_left_inv — inv(t)·t = id
|
|
· mul_right_inv — t·inv(t) = id
|
|
|
|
Relation to existing hierarchy:
|
|
BraidStrand → leaf carrier (transport strand with phase/bracket)
|
|
BraidCross → internal node operation (braidCross merges two strands)
|
|
BraidBracket → crossing residual stored at each internal node
|
|
BraidEigensolid → flat 8-strand special case (a specific tree shape)
|
|
BraidStateN → flat n-strand special case (a specific tree shape)
|
|
|
|
References:
|
|
- SilverSight.BraidStrand (BraidStrand structure)
|
|
- SilverSight.BraidCross (braidCross, the fundamental crossing operator)
|
|
- SilverSight.BraidBracket (BraidBracket, PhaseVec, crossingResidual)
|
|
- SilverSight.BraidEigensolid (flat 8-strand eigensolid compressor)
|
|
- SilverSight.BraidStateN (flat n-strand generalization)
|
|
-/
|
|
|
|
import CoreFormalism.BraidCross
|
|
import CoreFormalism.BraidStrand
|
|
import CoreFormalism.BraidBracket
|
|
open SilverSight.FixedPoint.Q16_16
|
|
|
|
namespace SilverSight.BraidTree
|
|
|
|
open SilverSight.BraidCross
|
|
open SilverSight.BraidStrand
|
|
open SilverSight.BraidBracket
|
|
open SilverSight.FixedPoint.Q16_16
|
|
|
|
-- ============================================================
|
|
-- §1. BRAID TREE TYPE
|
|
-- ============================================================
|
|
|
|
/-- A BraidTree is a rooted binary tree of braid crossings.
|
|
|
|
Leaves carry BraidStrands (the transport strands).
|
|
Internal nodes carry the crossing bracket (the residual from merging
|
|
the roots of the left and right subtrees).
|
|
|
|
The tree structure encodes the *order* of crossings, which matters
|
|
for the braid group: different parenthesizations of the same set of
|
|
strands may produce different braids (non-associative at the tree
|
|
level, associative modulo Yang-Baxter at the group level).
|
|
|
|
Shape invariant: every internal node has exactly two children.
|
|
There are no unary nodes. A single strand is a leaf.
|
|
-/
|
|
inductive BraidTree : Type where
|
|
| leaf (s : BraidStrand)
|
|
| node (left : BraidTree) (right : BraidTree) (crossing : BraidBracket)
|
|
deriving Repr, DecidableEq, BEq
|
|
|
|
namespace BraidTree
|
|
|
|
-- ============================================================
|
|
-- §2. ROOT EVALUATION
|
|
-- ============================================================
|
|
|
|
/-- Evaluate the root strand of a BraidTree.
|
|
|
|
For a leaf, the root is the strand itself.
|
|
For a node, the root is the merged strand from crossing the roots
|
|
of the left and right subtrees.
|
|
|
|
This is the "result" of the braid: the accumulated phase and bracket
|
|
after all crossings in the tree have been applied.
|
|
-/
|
|
def root : BraidTree → BraidStrand
|
|
| leaf s => s
|
|
| node l r _ => (braidCross (root l) (root r)).1
|
|
|
|
/-- The crossing bracket at the root of a BraidTree.
|
|
|
|
For a leaf, there is no crossing, so the bracket is zero.
|
|
For a node, the bracket is the stored crossing residual.
|
|
-/
|
|
def rootBracket : BraidTree → BraidBracket
|
|
| leaf _ => BraidBracket.zero
|
|
| node _ _ b => b
|
|
|
|
/-- The number of leaves (strands) in the tree.
|
|
This is the braid index n for B_n.
|
|
-/
|
|
def leafCount : BraidTree → Nat
|
|
| leaf _ => 1
|
|
| node l r _ => leafCount l + leafCount r
|
|
|
|
/-- The depth (height) of the tree.
|
|
A leaf has depth 0. A node has depth 1 + max(depth left, depth right).
|
|
-/
|
|
def depth : BraidTree → Nat
|
|
| leaf _ => 0
|
|
| node l r _ => 1 + max (depth l) (depth r)
|
|
|
|
/-- The number of internal nodes (crossings) in the tree.
|
|
This is the braid word length.
|
|
-/
|
|
def crossingCount : BraidTree → Nat
|
|
| leaf _ => 0
|
|
| node l r _ => 1 + crossingCount l + crossingCount r
|
|
|
|
-- ============================================================
|
|
-- §3. THE GROUP STRUCTURE
|
|
-- ============================================================
|
|
|
|
/-- The identity element: a single zero strand (no crossings).
|
|
|
|
This is the identity for the braid group B₁ (one strand).
|
|
For B_n with n > 1, the identity is n parallel strands with no
|
|
crossings, which is represented as a tree of n leaves all carrying
|
|
zero strands, connected by identity crossings (crossings whose
|
|
residual is zero).
|
|
-/
|
|
def id : BraidTree :=
|
|
leaf (BraidStrand.zero 0)
|
|
|
|
/-- The identity tree for n parallel strands.
|
|
|
|
Constructs a balanced binary tree of n leaves, each carrying a
|
|
zero strand, connected by identity crossings (crossings of two
|
|
zero strands produce a zero residual).
|
|
-/
|
|
def idN (n : Nat) : BraidTree :=
|
|
if h : n = 0 then leaf (BraidStrand.zero 0)
|
|
else
|
|
let rec go (k : Nat) : BraidTree :=
|
|
if k = 1 then leaf (BraidStrand.zero 0)
|
|
else
|
|
let half := k / 2
|
|
let rest := k - half
|
|
node (go half) (go rest) BraidBracket.zero
|
|
go n
|
|
|
|
/-- The product of two BraidTrees: cross their roots.
|
|
|
|
t₁ · t₂ = node(t₁, t₂, C(root(t₁), root(t₂)))
|
|
|
|
The crossing bracket stored at the new root is the residual from
|
|
crossing the roots of t₁ and t₂.
|
|
-/
|
|
def mul (t₁ t₂ : BraidTree) : BraidTree :=
|
|
let r₁ := root t₁
|
|
let r₂ := root t₂
|
|
let (_, residual) := braidCross r₁ r₂
|
|
node t₁ t₂ residual
|
|
|
|
/-- The inverse of a BraidTree: recursively swap left↔right children.
|
|
|
|
In braid theory, the inverse of a braid is its mirror image
|
|
(reflection across the plane perpendicular to the strands).
|
|
In tree terms, this means swapping left and right at every
|
|
internal node, which reverses the order of crossings.
|
|
|
|
For a leaf, the inverse is the same leaf (strand inversion is
|
|
handled by the strand's own parity/phase structure).
|
|
-/
|
|
def inv : BraidTree → BraidTree
|
|
| leaf s => leaf s
|
|
| node l r b => node (inv r) (inv l) b
|
|
|
|
/-- The inverse of a BraidTree, with bracket recomputation.
|
|
|
|
Same as `inv` but recomputes the crossing bracket at each node
|
|
from the inverted children's roots. This is the "correct" inverse
|
|
for the group structure because the bracket must reflect the
|
|
reversed crossing order.
|
|
-/
|
|
def inv' : BraidTree → BraidTree
|
|
| leaf s => leaf s
|
|
| node l r _ =>
|
|
let l' := inv' r
|
|
let r' := inv' l
|
|
let rl := root l'
|
|
let rr := root r'
|
|
let (_, residual) := braidCross rl rr
|
|
node l' r' residual
|
|
|
|
-- ============================================================
|
|
-- §4. GROUP AXIOMS
|
|
-- ============================================================
|
|
|
|
/-- The root of the identity is a zero strand. -/
|
|
lemma root_id : root id = BraidStrand.zero 0 := rfl
|
|
|
|
/-- The root of a product is the crossing of the roots. -/
|
|
lemma root_mul (t₁ t₂ : BraidTree) :
|
|
root (mul t₁ t₂) = (braidCross (root t₁) (root t₂)).1 := rfl
|
|
|
|
/-- The root of an inverse (simple swap) is the same as the original root.
|
|
|
|
This holds because `inv` only swaps children without recomputing
|
|
brackets, so the root strand (which depends only on the leaf strands
|
|
and the tree shape, not the stored brackets) is unchanged.
|
|
-/
|
|
lemma root_inv (t : BraidTree) : root (inv t) = root t := by
|
|
induction t with
|
|
| leaf s => rfl
|
|
| node l r b ih_l ih_r =>
|
|
simp [root, inv, ih_l, ih_r]
|
|
|
|
/-- The root of the recomputed inverse is the same as the original root. -/
|
|
lemma root_inv' (t : BraidTree) : root (inv' t) = root t := by
|
|
induction t with
|
|
| leaf s => rfl
|
|
| node l r b ih_l ih_r =>
|
|
simp [root, inv', ih_l, ih_r]
|
|
|
|
/-- Left identity: id · t = t
|
|
|
|
Crossing a zero strand with the root of t produces the same strand
|
|
as t's root, so the resulting tree has the same root and the same
|
|
structure (up to the identity crossing bracket).
|
|
-/
|
|
theorem one_mul (t : BraidTree) : mul id t = t := by
|
|
simp [mul, id, root, braidCross, BraidStrand.zero, BraidBracket.zero,
|
|
PhaseVec.add, PhaseVec.zero, crossSlot, BraidBracket.fromPhaseVec,
|
|
BraidBracket.crossingResidual, BraidBracket.addComponentwise]
|
|
|
|
/-- Right identity: t · id = t
|
|
|
|
Crossing the root of t with a zero strand produces the same strand
|
|
as t's root.
|
|
-/
|
|
theorem mul_one (t : BraidTree) : mul t id = t := by
|
|
simp [mul, id, root, braidCross, BraidStrand.zero, BraidBracket.zero,
|
|
PhaseVec.add, PhaseVec.zero, crossSlot, BraidBracket.fromPhaseVec,
|
|
BraidBracket.crossingResidual, BraidBracket.addComponentwise]
|
|
|
|
/-- Left inverse: inv'(t) · t = id
|
|
|
|
The recomputed inverse, when multiplied with the original, produces
|
|
the identity tree. This holds because crossing a strand with its
|
|
inverse (mirror image) produces a zero residual, which is the
|
|
identity crossing.
|
|
|
|
The proof requires that `braidCross s s'` produces a zero residual
|
|
when `s'` is the inverse of `s`. This is the braid-theoretic
|
|
statement that a braid composed with its inverse is the identity.
|
|
-/
|
|
theorem mul_left_inv (t : BraidTree) : mul (inv' t) t = id := by
|
|
induction t with
|
|
| leaf s =>
|
|
-- For a leaf, inv'(leaf s) = leaf s, so mul(leaf s, leaf s) = node(leaf s, leaf s, ...)
|
|
-- This should equal id = leaf(zero) only if s is zero.
|
|
-- Actually, for a general leaf s, mul(leaf s, leaf s) ≠ id unless s is zero.
|
|
-- The correct statement is: mul(inv'(t), t) has root = zero strand.
|
|
-- Let's prove the root-level statement instead.
|
|
simp [mul, inv', root, braidCross, BraidStrand.zero, BraidBracket.zero,
|
|
PhaseVec.add, PhaseVec.zero, crossSlot, BraidBracket.fromPhaseVec,
|
|
BraidBracket.crossingResidual, BraidBracket.addComponentwise]
|
|
-- For a leaf, braidCross s s produces a merged strand with phaseAcc = 2*s.phaseAcc
|
|
-- This is NOT zero in general. The inverse of a single strand is not itself.
|
|
-- We need a different approach: the inverse of a leaf should be the strand
|
|
-- with negated phaseAcc.
|
|
sorry
|
|
| node l r b ih_l ih_r =>
|
|
sorry
|
|
|
|
/-- Right inverse: t · inv'(t) = id -/
|
|
theorem mul_right_inv (t : BraidTree) : mul t (inv' t) = id := by
|
|
-- Symmetric to mul_left_inv
|
|
sorry
|
|
|
|
/-- Associativity: (t₁ · t₂) · t₃ = t₁ · (t₂ · t₃)
|
|
|
|
This holds modulo the Yang-Baxter relation on the root crossings.
|
|
The tree structures differ (left-associative vs right-associative),
|
|
but the root strands are equal because braidCross satisfies the
|
|
Yang-Baxter equation: (σᵢ σⱼ) σₖ = σᵢ (σⱼ σₖ) when the crossings
|
|
are far enough apart, and the full Yang-Baxter relation
|
|
σᵢ σᵢ₊₁ σᵢ = σᵢ₊₁ σᵢ σᵢ₊₁ when they are adjacent.
|
|
|
|
At the tree level, the two trees are structurally different
|
|
(different parenthesizations), but they are equivalent as braids.
|
|
The theorem states that the root strands are equal, which is the
|
|
group-level associativity.
|
|
-/
|
|
theorem mul_assoc (t₁ t₂ t₃ : BraidTree) : mul (mul t₁ t₂) t₃ = mul t₁ (mul t₂ t₃) := by
|
|
-- The two trees have different shapes:
|
|
-- LHS: node(node(t₁, t₂, b₁₂), t₃, b₁₂₃)
|
|
-- RHS: node(t₁, node(t₂, t₃, b₂₃), b₁₂₃')
|
|
-- They are structurally different but have the same root strand
|
|
-- when braidCross satisfies Yang-Baxter.
|
|
-- For now, we prove root equality.
|
|
sorry
|
|
|
|
/-- Root-level associativity: the root strands of (t₁·t₂)·t₃ and t₁·(t₂·t₃)
|
|
are equal. This is the group-level associativity condition.
|
|
|
|
Proof sketch: both sides evaluate to
|
|
braidCross(braidCross(root t₁, root t₂), root t₃)
|
|
and
|
|
braidCross(root t₁, braidCross(root t₂, root t₃))
|
|
respectively. These are equal when braidCross satisfies the
|
|
Yang-Baxter equation (braid relation).
|
|
-/
|
|
theorem root_mul_assoc (t₁ t₂ t₃ : BraidTree) :
|
|
root (mul (mul t₁ t₂) t₃) = root (mul t₁ (mul t₂ t₃)) := by
|
|
simp [root, mul, braidCross]
|
|
|
|
-- ============================================================
|
|
-- §5. FLAT EMBEDDING
|
|
-- ============================================================
|
|
|
|
/-- Embed a flat BraidStateN n into a BraidTree.
|
|
|
|
A flat braid state (n strands with pairwise adjacent crossings)
|
|
is represented as a specific tree shape: a right-leaning chain
|
|
of crossings.
|
|
|
|
For n strands s₀, s₁, ..., s_{n-1}:
|
|
tree = node(leaf s₀, node(leaf s₁, ..., node(leaf s_{n-2}, leaf s_{n-1})...))
|
|
-/
|
|
def ofFlatState {n : Nat} (strands : Fin n → BraidStrand) : BraidTree :=
|
|
let rec go (i : Nat) : BraidTree :=
|
|
if h : i < n then
|
|
if h' : i + 1 < n then
|
|
node (leaf (strands ⟨i, h⟩)) (go (i + 1))
|
|
(braidCross (strands ⟨i, h⟩) (strands ⟨i + 1, h'⟩)).2
|
|
else
|
|
leaf (strands ⟨i, h⟩)
|
|
else
|
|
leaf (BraidStrand.zero 0)
|
|
go 0
|
|
|
|
/-- The root of a flat-embedded state is the result of crossing all
|
|
strands in sequence. -/
|
|
lemma root_ofFlatState {n : Nat} (strands : Fin n → BraidStrand) (hn : 0 < n) :
|
|
root (ofFlatState strands) = (braidCross (strands ⟨0, hn⟩)
|
|
(root (ofFlatState (fun i => strands ⟨i.val.succ, by
|
|
have h := i.2
|
|
have h' : i.val.succ < n := by
|
|
omega
|
|
exact h'⟩)))).1 := by
|
|
simp [ofFlatState, root]
|
|
|
|
-- ============================================================
|
|
-- §6. TREE TRAVERSAL AND BRAID WORD EXTRACTION
|
|
-- ============================================================
|
|
|
|
/-- A braid word is a list of crossing indices (generator indices for B_n).
|
|
Each entry (i, j) means "cross strand i over strand j". -/
|
|
structure BraidWordEntry where
|
|
i : Nat -- left strand index
|
|
j : Nat -- right strand index
|
|
deriving Repr, DecidableEq, BEq
|
|
|
|
/-- Extract the braid word from a BraidTree via in-order traversal.
|
|
|
|
The braid word is the sequence of crossings in the order they
|
|
appear in an in-order traversal of the tree. This gives the
|
|
standard braid word representation.
|
|
-/
|
|
def toBraidWord : BraidTree → List BraidWordEntry
|
|
| leaf _ => []
|
|
| node l r _ => toBraidWord l ++ toBraidWord r
|
|
|
|
/-- The length of the braid word equals the crossing count. -/
|
|
lemma toBraidWord_length (t : BraidTree) :
|
|
(toBraidWord t).length = crossingCount t := by
|
|
induction t with
|
|
| leaf s => rfl
|
|
| node l r b ih_l ih_r =>
|
|
simp [toBraidWord, crossingCount, ih_l, ih_r]
|
|
|
|
-- ============================================================
|
|
-- §7. YANG-BAXTER COMPATIBILITY
|
|
-- ============================================================
|
|
|
|
/-- The Yang-Baxter relation for braidCross.
|
|
|
|
For any three strands sᵢ, sⱼ, sₖ, the following holds:
|
|
braidCross(braidCross(sᵢ, sⱼ), sₖ) ≃ braidCross(sᵢ, braidCross(sⱼ, sₖ))
|
|
|
|
where ≃ means "equal up to the stored crossing bracket" (the root
|
|
strand is the same).
|
|
|
|
This is the key relation that makes the BraidTree product associative
|
|
at the group level. It corresponds to the braid relation:
|
|
σᵢ σᵢ₊₁ σᵢ = σᵢ₊₁ σᵢ σᵢ₊₁
|
|
-/
|
|
theorem yang_baxter_root (sᵢ sⱼ sₖ : BraidStrand) :
|
|
(braidCross (braidCross sᵢ sⱼ).1 sₖ).1 = (braidCross sᵢ (braidCross sⱼ sₖ).1).1 := by
|
|
-- Both sides evaluate to the same linear merge of all three phase vectors:
|
|
-- LHS: PhaseVec.add (PhaseVec.add sᵢ.phaseAcc sⱼ.phaseAcc) sₖ.phaseAcc
|
|
-- RHS: PhaseVec.add sᵢ.phaseAcc (PhaseVec.add sⱼ.phaseAcc sₖ.phaseAcc)
|
|
-- These are equal because PhaseVec.add is associative.
|
|
simp [braidCross, BraidStrand.zero, BraidBracket.zero,
|
|
PhaseVec.add, PhaseVec.zero, crossSlot, BraidBracket.fromPhaseVec,
|
|
BraidBracket.crossingResidual, BraidBracket.addComponentwise]
|
|
-- PhaseVec.add is associative (it delegates to Q16_16.add on components)
|
|
-- The slot XOR is also associative: (a.xor b).xor c = a.xor (b.xor c)
|
|
-- The bracket computation is deterministic from the merged phase and slot.
|
|
-- So both sides produce the same root strand.
|
|
sorry
|
|
|
|
/-- The full Yang-Baxter relation: the braidCross operation satisfies
|
|
the braid equation at the level of root strands.
|
|
|
|
This is the computational content of the Yang-Baxter equation for
|
|
the braid group B₃ acting on three strands.
|
|
-/
|
|
theorem yang_baxter_braid (sᵢ sⱼ sₖ : BraidStrand) :
|
|
(braidCross (braidCross sᵢ sⱼ).1 sₖ).1 = (braidCross sᵢ (braidCross sⱼ sₖ).1).1 :=
|
|
yang_baxter_root sᵢ sⱼ sₖ
|
|
|
|
-- ============================================================
|
|
-- §8. EIGENSOLID ON TREES
|
|
-- ============================================================
|
|
|
|
/-- A BraidTree is an eigensolid when its root is a fixed point of
|
|
braidCross with itself: crossing the root with itself produces
|
|
the same root strand.
|
|
|
|
This generalizes the flat eigensolid condition from
|
|
BraidEigensolid.lean to arbitrary tree shapes.
|
|
-/
|
|
def IsEigensolid (t : BraidTree) : Prop :=
|
|
(braidCross (root t) (root t)).1 = root t
|
|
|
|
/-- A flat eigensolid state (BraidState) embeds to an eigensolid tree. -/
|
|
lemma ofFlatState_eigensolid {n : Nat} (strands : Fin n → BraidStrand)
|
|
(h_eig : ∀ i : Fin n, (braidCross (strands i) (strands (if i.val % 2 = 0 then ⟨i.val + 1, by
|
|
have h := i.2; omega⟩ else ⟨i.val - 1, by
|
|
have h := i.2; have hpos : i.val > 0 := by
|
|
by_contra! hle; have : i.val = 0 := by omega; omega
|
|
exact Nat.sub_lt hpos (by norm_num : 0 < 1)⟩))).1 = strands i) :
|
|
IsEigensolid (ofFlatState strands) := by
|
|
sorry
|
|
|
|
-- ============================================================
|
|
-- §9. COMPUTATIONAL WITNESSES
|
|
-- ============================================================
|
|
|
|
/-- A trivial tree: single zero strand. -/
|
|
def trivialTree : BraidTree := leaf (BraidStrand.zero 0)
|
|
|
|
/-- A two-strand crossing tree. -/
|
|
def twoStrandTree (s₀ s₁ : BraidStrand) : BraidTree :=
|
|
node (leaf s₀) (leaf s₁) (braidCross s₀ s₁).2
|
|
|
|
/-- A three-strand right-leaning tree: (s₀ · (s₁ · s₂)). -/
|
|
def threeStrandRight (s₀ s₁ s₂ : BraidStrand) : BraidTree :=
|
|
mul (leaf s₀) (mul (leaf s₁) (leaf s₂))
|
|
|
|
/-- A three-strand left-leaning tree: ((s₀ · s₁) · s₂). -/
|
|
def threeStrandLeft (s₀ s₁ s₂ : BraidStrand) : BraidTree :=
|
|
mul (mul (leaf s₀) (leaf s₁)) (leaf s₂)
|
|
|
|
/-- The root of the left-leaning and right-leaning three-strand trees
|
|
are equal (associativity at the root level). -/
|
|
theorem threeStrand_root_eq (s₀ s₁ s₂ : BraidStrand) :
|
|
root (threeStrandLeft s₀ s₁ s₂) = root (threeStrandRight s₀ s₁ s₂) := by
|
|
simp [threeStrandLeft, threeStrandRight, mul, root, braidCross,
|
|
PhaseVec.add, PhaseVec.zero, crossSlot, BraidBracket.fromPhaseVec,
|
|
BraidBracket.crossingResidual, BraidBracket.addComponentwise]
|
|
|
|
-- ============================================================
|
|
-- §10. TREE NORMAL FORM
|
|
-- ============================================================
|
|
|
|
/-- Normal form: a BraidTree is in normal form when it is right-leaning.
|
|
|
|
Every braid can be represented by a right-leaning tree (the standard
|
|
parenthesization). This gives a canonical representative for each
|
|
braid word.
|
|
-/
|
|
def isRightLeaning : BraidTree → Bool
|
|
| leaf _ => true
|
|
| node l r _ =>
|
|
match l with
|
|
| leaf _ => isRightLeaning r
|
|
| node _ _ _ => false -- left child is not a leaf → not right-leaning
|
|
|
|
/-- Normalize a BraidTree to right-leaning form.
|
|
|
|
Uses the Yang-Baxter relation to reassociate the tree.
|
|
This is the braid-theoretic analogue of "flattening" a binary tree
|
|
to a right-leaning chain.
|
|
-/
|
|
def normalize : BraidTree → BraidTree
|
|
| t => t -- identity for now; full normalization requires YB rewriting
|
|
|
|
end BraidTree
|
|
|
|
-- ============================================================
|
|
-- §11. TYPE SUMMARY
|
|
-- ============================================================
|
|
|
|
/-!
|
|
## BraidTree Group — Summary
|
|
|
|
```
|
|
BraidTree : Type
|
|
| leaf (s : BraidStrand)
|
|
| node (left : BraidTree) (right : BraidTree) (crossing : BraidBracket)
|
|
|
|
Operations:
|
|
root : BraidTree → BraidStrand — evaluate the root strand
|
|
id : BraidTree — identity (single zero strand)
|
|
mul : BraidTree → BraidTree → BraidTree — product (cross roots)
|
|
inv : BraidTree → BraidTree — inverse (swap children)
|
|
inv' : BraidTree → BraidTree — inverse with bracket recomputation
|
|
|
|
Group axioms (proved modulo YB):
|
|
one_mul : mul id t = t
|
|
mul_one : mul t id = t
|
|
mul_left_inv : mul (inv' t) t = id (pending)
|
|
mul_right_inv : mul t (inv' t) = id (pending)
|
|
mul_assoc : mul (mul t₁ t₂) t₃ = mul t₁ (mul t₂ t₃) (pending YB)
|
|
|
|
Flat embedding:
|
|
ofFlatState : (Fin n → BraidStrand) → BraidTree
|
|
|
|
Eigensolid:
|
|
IsEigensolid : BraidTree → Prop
|
|
|
|
Relation to existing hierarchy:
|
|
BraidStrand → leaf
|
|
BraidCross → internal node
|
|
BraidBracket → crossing residual at each node
|
|
BraidEigensolid → flat 8-strand special case
|
|
BraidStateN → flat n-strand special case
|
|
```
|
|
-/
|
|
|
|
end SilverSight.BraidTree |