SilverSight/formal/CoreFormalism/BraidTree.lean
allaun 3b6baec64e wip: durability snapshot of local working tree (pre-existing, uncommitted)
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>
2026-07-02 20:49:53 -05:00

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