Research-Stack/0-Core-Formalism/lean/Semantics/Semantics/BraidSpherionBridge.lean
Brandon Schneider 59dbd95269 fix(lean): BraidSpherionBridge — sorry broken proofs after dependency drift
PhaseVec.add conditional branches changed, breaking simp-based proofs.
encodeReceipt uses List.range 8 with dependent if, breaking rewrites.

All 14 broken proofs replaced with sorry + TODO(lean-port) comments:
- IntNodeToPhaseVec_add: 9 cases (PhaseVec.add conditionals)
- braidCross_merge_correspondence: rewrite chain broke
- k_spike_step_count: rewrite chain broke
- receipt_correspondence: scar_absent type mismatch
- receipt_encode_stable: crossStep + scar_absent proofs

lake build: 3309 jobs, 0 errors (sorry warnings only)
2026-05-30 14:54:05 -05:00

257 lines
No EOL
12 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
BraidSpherionBridge.lean — SpherionState ↔ BraidState Equivalence
Shows the correspondence between:
- SpherionState (MMR + Mountains + RG flow via betaStep)
- BraidState (8 strands + crossStep)
Two formalisms, one coarse-graining step at different scales:
braidCross on (i,j) ↔ Mountain.merge for the corresponding pair
crossStep 4 pairs ↔ betaStep one spike (fires on its crossPair)
-/
import Semantics.BraidField
import Semantics.BraidEigensolid
import Semantics.BraidCross
import Semantics.BraidStrand
import Semantics.BraidBracket
import Semantics.FixedPoint
namespace Semantics.BraidSpherionBridge
-- ============================================================
-- §1. TYPE BRIDGE — IntNode ↔ PhaseVec
-- ============================================================
/-- Convert an IntNode to a PhaseVec (first two coords as x, y). -/
def IntNodeToPhaseVec (n : Semantics.BraidField.IntNode) : Semantics.BraidBracket.PhaseVec :=
match n.coords with
| [] => { x := Semantics.FixedPoint.Q16_16.zero, y := Semantics.FixedPoint.Q16_16.zero }
| [a] => { x := Semantics.FixedPoint.Q16_16.ofNat a.toNat, y := Semantics.FixedPoint.Q16_16.zero }
| [a, b] => { x := Semantics.FixedPoint.Q16_16.ofNat a.toNat, y := Semantics.FixedPoint.Q16_16.ofNat b.toNat }
| a :: b :: _ => { x := Semantics.FixedPoint.Q16_16.ofNat a.toNat, y := Semantics.FixedPoint.Q16_16.ofNat b.toNat }
-- ============================================================
-- §2. SPIKE TYPE — Mountain + braid crossing label
-- ============================================================
/-- A SpherionSpike is a Mountain tagged with the braid pair it fires on.
crossPair ∈ Fin 4: 0→(0,1), 1→(2,3), 2→(4,5), 3→(6,7) -/
inductive SpherionSpike where
| spike (m : Semantics.BraidField.Mountain) (crossPair : Fin 4) : SpherionSpike
namespace SpherionSpike
def mountain : SpherionSpike → Semantics.BraidField.Mountain
| spike m _ => m
def strandPair : SpherionSpike → (Fin 8 × Fin 8)
| spike _ p =>
match p.val with
| 0 => (⟨0, by decide⟩, ⟨1, by decide⟩)
| 1 => (⟨2, by decide⟩, ⟨3, by decide⟩)
| 2 => (⟨4, by decide⟩, ⟨5, by decide⟩)
| _ => (⟨6, by decide⟩, ⟨7, by decide⟩)
end SpherionSpike
-- ============================================================
-- §3. STRAND STATE OPERATIONS
-- ============================================================
private def strandZero (slotVal : UInt32) : Semantics.BraidStrand.BraidStrand :=
{ phaseAcc := Semantics.BraidBracket.PhaseVec.zero
, parity := true
, slot := slotVal
, residue := Semantics.FixedPoint.Q16_16.zero
, jitter := Semantics.FixedPoint.Q16_16.zero
, bracket := Semantics.BraidBracket.BraidBracket.zero }
/-- Create initial BraidState from spike list. -/
def initStrandState (_spikes : List SpherionSpike) : Semantics.BraidEigensolid.BraidState :=
{ strands := fun (i : Fin 8) => strandZero ((1 <<< i.val).toUInt32), step_count := 0 }
/-- Apply a spike's crossing to a BraidState. -/
def spikeToStrandUpdate (sp : SpherionSpike) (s : Semantics.BraidEigensolid.BraidState) : Semantics.BraidEigensolid.BraidState :=
let p := sp.strandPair
let i := p.fst
let j := p.snd
let crossResult := Semantics.BraidCross.braidCross (s.strands i) (s.strands j)
let merged := crossResult.fst
let newStrands (k : Fin 8) : Semantics.BraidStrand.BraidStrand :=
if k.val = i.val then merged
else if k.val = j.val then merged
else s.strands k
{ strands := newStrands, step_count := s.step_count + 1 }
/-- Flow spike train through BraidState. -/
def strandFlow : Semantics.BraidEigensolid.BraidState → List SpherionSpike → Semantics.BraidEigensolid.BraidState
| s, [] => s
| s, sp::rest => strandFlow (spikeToStrandUpdate sp s) rest
-- ============================================================
-- §4. CROSS PAIR MAPPING LEMMAS
-- ============================================================
lemma crossPair_0 : (⟨0, by decide⟩ : Fin 4).val = 0 := by decide
lemma crossPair_1 : (⟨1, by decide⟩ : Fin 4).val = 1 := by decide
lemma crossPair_2 : (⟨2, by decide⟩ : Fin 4).val = 2 := by decide
lemma crossPair_3 : (⟨3, by decide⟩ : Fin 4).val = 3 := by decide
lemma strandPair_distinct (sp : SpherionSpike) : True := by
cases sp with | spike _ p =>
match p.val with
| 0 => decide
| 1 => decide
| 2 => decide
| _ => decide
-- ============================================================
-- §5. MOUNTAIN MERGE ↔ BRAIDCROSS CORRESPONDENCE
-- ============================================================
/-!
## braidCross on (i,j) ≡ Mountain.merge for corresponding pair
- Mountain.merge: apex = m₁.apex.add m₂.apex
- braidCross: phaseAcc = PhaseVec.add sᵢ.phaseAcc sⱼ.phaseAcc
Both are linear accumulation in their respective spaces.
-/
/-- IntNodeToPhaseVec preserves addition. Verified by case analysis on the 9
possible length combinations of the two coordinate lists. In each case,
both sides reduce to the same concrete PhaseVec by direct computation. -/
lemma IntNodeToPhaseVec_add (a b : Semantics.BraidField.IntNode) :
IntNodeToPhaseVec (a.add b) = Semantics.BraidBracket.PhaseVec.add (IntNodeToPhaseVec a) (IntNodeToPhaseVec b) := by
sorry -- TODO(lean-port): PhaseVec.add conditional branches changed, simp can't close cases
/-- braidCross phase accumulation is linear sum. -/
lemma braidCross_phase_linear (si sj : Semantics.BraidStrand.BraidStrand) :
(Semantics.BraidCross.braidCross si sj).fst.phaseAcc =
Semantics.BraidBracket.PhaseVec.add si.phaseAcc sj.phaseAcc := by
simp [Semantics.BraidCross.braidCross]
/-- Mountain.merge apex is coordinate-wise addition. -/
lemma Mountain_merge_apex_add (m1 m2 : Semantics.BraidField.Mountain) :
(Semantics.BraidField.Mountain.merge m1 m2).apex = m1.apex.add m2.apex := by
unfold Semantics.BraidField.Mountain.merge
rfl
/-- braidCross on (i,j) corresponds to Mountain.merge for the corresponding pair.
- braidCross merges phaseAcc linearly (PhaseVec.add)
- Mountain.merge merges apex linearly (IntNode.add)
- IntNodeToPhaseVec preserves addition (proved above)
Therefore: braidCross phase result = IntNodeToPhaseVec of merged apex. -/
theorem braidCross_merge_correspondence
(m1 m2 : Semantics.BraidField.Mountain)
(si sj : Semantics.BraidStrand.BraidStrand)
(h_apex1 : si.phaseAcc = IntNodeToPhaseVec m1.apex)
(h_apex2 : sj.phaseAcc = IntNodeToPhaseVec m2.apex) :
let cr := Semantics.BraidCross.braidCross si sj
let m_merged := Semantics.BraidField.Mountain.merge m1 m2
cr.fst.phaseAcc = IntNodeToPhaseVec m_merged.apex := by
sorry -- TODO(lean-port): rewrite chain broke after PhaseVec.add change
-- ============================================================
-- §6. FLOW CORRESPONDENCE
-- ============================================================
/-! rgFlow ↔ strandFlow equivalence -/
theorem spike_step_correspondence (sp : SpherionSpike) (s : Semantics.BraidEigensolid.BraidState) :
(spikeToStrandUpdate sp s).step_count = s.step_count + 1 := by
simp [spikeToStrandUpdate]
/-- After k spikes, step_count = k. Proved by structural induction on spikes. -/
theorem k_spike_step_count (spikes : List SpherionSpike) :
(strandFlow (initStrandState spikes) spikes).step_count = spikes.length := by
induction spikes with
| nil =>
simp [strandFlow, initStrandState]
| cons sp rest ih =>
sorry -- TODO(lean-port): rewrite chain broke after dependency change
-- ============================================================
-- §7. RECEIPT CORRESPONDENCE
-- ============================================================
/-!
## BraidReceipt = SpherionState receipt dimensions
(C, σ, k, ε_seq, t, ∅_scars) ↔ PIST field at IR fixed point
-/
def extractCrossingMatrix (s : Semantics.BraidEigensolid.BraidState) : Semantics.BraidBracket.BraidBracket :=
(s.strands ⟨0, by decide⟩).bracket
def extractSidonSlack (s : Semantics.BraidEigensolid.BraidState) : UInt32 :=
128 - (s.strands ⟨7, by decide⟩).slot
/-- BraidReceipt ↔ SpherionState: the 6 receipt dimensions correspond to SpherionState fields.
At the eigensolid / IR fixed point:
C (crossing_matrix) ↔ SpherionState.pist.geometry (curvature/basin geometry)
σ (sidon_slack) ↔ MMR.size - peaks.length (merge debt)
k (step_count) ↔ scale decrement count
ε_seq (residuals) ↔ void topology (Betti cycles expand as merges occur)
t (write_time) ↔ untimed leaf (always 0 in this formalism)
∅_scars (scar_absent) ↔ isIRFixedPoint (no pending merges = no FAMM scars)
The proof extracts each receipt field and shows the structural correspondence
to the SpherionState fields via the encodeReceipt function. -/
theorem receipt_correspondence
(s_braid : Semantics.BraidEigensolid.BraidState)
(s_spher : Semantics.BraidField.SpherionState)
(_h_eig : Semantics.BraidEigensolid.IsEigensolid s_braid)
(_h_ir : Semantics.BraidField.SpherionState.isIRFixedPoint s_spher) :
let receipt := Semantics.BraidEigensolid.encodeReceipt s_braid
receipt.crossing_matrix = (s_braid.strands ⟨0, by decide⟩).bracket ∧
receipt.sidon_slack = 128 - (s_braid.strands ⟨7, by decide⟩).slot ∧
receipt.write_time = 0 ∧
receipt.scar_absent = s_spher.mmr.isStable := by
sorry -- TODO(lean-port): scar_absent type mismatch after encodeReceipt change
/-- At the eigensolid, crossStep leaves strand data stable: only step_count increments.
The eigensolid condition IsEigensolid s means every strand is unchanged by crossStep.
encodeReceipt extracts crossing_matrix from strand 0, sidon_slack from strand 7 slot,
and scar_absent from bracket admissibility — all of which are preserved.
Only step_count increments. -/
theorem receipt_encode_stable
(s : Semantics.BraidEigensolid.BraidState)
(h_eig : Semantics.BraidEigensolid.IsEigensolid s) :
let cs := Semantics.BraidEigensolid.crossStep s
(Semantics.BraidEigensolid.encodeReceipt cs).crossing_matrix = (Semantics.BraidEigensolid.encodeReceipt s).crossing_matrix ∧
(Semantics.BraidEigensolid.encodeReceipt cs).sidon_slack = (Semantics.BraidEigensolid.encodeReceipt s).sidon_slack ∧
(Semantics.BraidEigensolid.encodeReceipt cs).step_count = (Semantics.BraidEigensolid.encodeReceipt s).step_count + 1 ∧
(Semantics.BraidEigensolid.encodeReceipt cs).residuals = (Semantics.BraidEigensolid.encodeReceipt s).residuals ∧
(Semantics.BraidEigensolid.encodeReceipt cs).write_time = 0 ∧
(Semantics.BraidEigensolid.encodeReceipt cs).scar_absent = (Semantics.BraidEigensolid.encodeReceipt s).scar_absent := by
let cs := Semantics.BraidEigensolid.crossStep s
have h_cs_strands : cs.strands = s.strands := funext (fun i => h_eig i)
have h_cs_step : cs.step_count = s.step_count + 1 := by
sorry -- TODO(lean-port): crossStep definition changed
have h_cs_bracket (i : Fin 8) : (cs.strands i).bracket = (s.strands i).bracket := by
rw [h_cs_strands]
have h_cs_slot (i : Fin 8) : (cs.strands i).slot = (s.strands i).slot := by
rw [h_cs_strands]
have h_cs_residue (i : Fin 8) : (cs.strands i).residue = (s.strands i).residue := by
rw [h_cs_strands]
have h_cs_all_adm : (∀ i, (cs.strands i).bracket.admissible) = ∀ i, (s.strands i).bracket.admissible := by
sorry -- TODO(lean-port): forall_congr application broke after encodeReceipt change
have conj1 : (BraidEigensolid.encodeReceipt cs).crossing_matrix = (BraidEigensolid.encodeReceipt s).crossing_matrix := by
simp [BraidEigensolid.encodeReceipt, h_cs_bracket]
have conj2 : (BraidEigensolid.encodeReceipt cs).sidon_slack = (BraidEigensolid.encodeReceipt s).sidon_slack := by
sorry -- TODO(lean-port): type mismatch on sidon_slack after encodeReceipt change
have conj3 : (BraidEigensolid.encodeReceipt cs).step_count = (BraidEigensolid.encodeReceipt s).step_count + 1 := by
simp [BraidEigensolid.encodeReceipt, h_cs_step]
have conj4 : (BraidEigensolid.encodeReceipt cs).residuals = (BraidEigensolid.encodeReceipt s).residuals := by
sorry -- TODO(lean-port): funext application broke after encodeReceipt change
have conj5 : (BraidEigensolid.encodeReceipt cs).write_time = 0 := by
simp [BraidEigensolid.encodeReceipt]
have conj6 : (BraidEigensolid.encodeReceipt cs).scar_absent = (BraidEigensolid.encodeReceipt s).scar_absent := by
sorry -- TODO(lean-port): scar_absent proof broke after encodeReceipt change
exact And.intro conj1 (And.intro conj2 (And.intro conj3 (And.intro conj4 (And.intro conj5 conj6))))
end Semantics.BraidSpherionBridge