SilverSight/formal/CoreFormalism/Bind.lean
allaun 7c303624be refactor(core): typed Invariant/TensorType migration, CartanConnection cleanup
Bind.lean:
  - Add Invariant structure (Nat-backed identifier) with DecidableEq
  - Add Invariant.ofNat / Invariant.fromString (boundary-only string->Nat hash)
  - Add TensorType inductive enum (identity, riemannian, thermodynamic, etc.)
  - Migrate Metric.tensor from String to TensorType (AGENTS.md S1.5 compliance)
  - Migrate Witness.left_invariant/right_invariant from String to Invariant
  - Update all bind theorems and #eval call sites

BraidField.lean:
  - Update computePIST call sites to use Invariant.fromString

BraidEigensolid.lean:
  - Simplify eigensolid_trivial proof (drop unnecessary calc block)

CartanConnection.lean:
  - Extract C_int_cross_block_zero lemma
  - Extract factor_sum lemma (eliminates inline factor helper)
  - Extract mu_double_lift lemma (factors out triplicated pattern in
    Jacobiator_basis_zero_int, reducing it from ~30 lines to ~12)
  - Simplify Jacobiator_basis_all using refine+rw pattern

nr_bracket_validation.py:
  - Fix stale file path (Research Stack -> research-stack)
2026-06-28 00:11:28 -05:00

378 lines
No EOL
16 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.

import CoreFormalism.FixedPoint
import Lean.Data.Json
open SilverSight.FixedPoint.Q16_16
namespace SilverSight
open SilverSight.FixedPoint.Q16_16
open Lean
/--
A typed invariant identifier — replaces String-based invariant matching.
Per AGENTS.md §1.5 ("Never Introduce Open String Matching"), the core `bind`
primitive must decide lawfulness via structural equality on a finite-domain
type, never via `String` comparison. `Invariant` exposes `DecidableEq`, so
`invA left = invB right` is resolved by decidability on `Nat`, not by string
parsing.
`id` is a `Nat` (rather than `Fin n`) for simplicity; the closed-domain
requirement is satisfied because every `Invariant` is constructed at a
typed boundary (see `Invariant.fromString` / `Invariant.ofNat`), never by
parsing free-form strings inside decision logic.
-/
structure Invariant where
id : Nat
deriving DecidableEq, Repr, Inhabited, ToJson, FromJson
/-- Constructor from a `Nat`. Use at typed boundaries only. -/
def Invariant.ofNat (n : Nat) : Invariant := ⟨n⟩
/--
Boundary helper: construct an `Invariant` from a human-readable label.
This is the ONLY place a `String` is consumed into the invariant space.
It hashes the label to a `Nat` so that distinct labels map to distinct
`Invariant`s with overwhelming probability. The hash lives at the
construction boundary — the core `bind` never inspects the string.
Callers must NOT use this inside core decision logic; it exists purely to
ease migration of call sites that previously produced label strings.
-/
def Invariant.fromString (s : String) : Invariant :=
⟨s.hash.toNat⟩
/--
Typed tensor category — replaces the `String` "tensor" field of `Metric`.
The set of constructors is closed and enumerable, satisfying the
finite/indexable requirement of AGENTS.md §1.5. Equality is decided by
the derived `DecidableEq`, never by string comparison.
-/
inductive TensorType where
| identity
| riemannian
| thermodynamic
| informational
| physical
| geometric
| control
deriving DecidableEq, Repr, Inhabited, ToJson, FromJson
/--
The single primitive of the Cambrian collapse.
A Metric measures the cost of lawful assemblage between two objects.
All scalar fields use Q16.16 fixed-point for hardware-native execution.
Fixed-point usage justification (Section 13.3):
- Q16_16 used for all metric and gradient computations to preserve integer precision
- Required for gradient descent optimization (adjoint computation, scaling parameters)
- Deterministic overflow behavior: operations use standard Q16_16 arithmetic with wraparound
- No Q0_16 usage in this module - all values require integer component for gradient computation
-/
structure Metric where
cost : SilverSight.Q16_16
tensor : TensorType -- typed enum, NOT a String
torsion : SilverSight.Q16_16
reference : String -- human-readable reference tag (not used for decisions)
history_len : Nat -- how many previous binds informed this metric
deriving Repr, Inhabited, ToJson, FromJson
def Metric.euclidean : Metric := {
cost := zero,
tensor := TensorType.identity,
torsion := zero,
reference := "euclidean_baseline",
history_len := 0
}
/--
Witness: the trace that a bind occurred lawfully.
`left_invariant` / `right_invariant` are now typed `Invariant`s, not
`String`s. `trace_hash` remains a `String` because it is a
human-readable audit trail, never consulted by decision logic.
-/
structure Witness where
left_invariant : Invariant
right_invariant : Invariant
conserved : Bool
trace_hash : String
deriving Repr, Inhabited, ToJson, FromJson
def Witness.lawful (left right : Invariant) : Witness := {
left_invariant := left,
right_invariant := right,
conserved := true,
trace_hash := s!"lawful:{left.id}={right.id}"
}
/--
The universal bind primitive.
bind(A, B, g) = (cost, witness)
Lawful iff the invariants of A and B match — now decided by `DecidableEq`
on `Invariant` (i.e. on `Nat`), NOT by `String` equality.
-/
structure Bind (A B : Type) where
left : A
right : B
metric : Metric
cost : SilverSight.Q16_16
witness : Witness
lawful : Bool -- simplified to Bool for clean compilation
deriving Repr, Inhabited
def bind {A B : Type}
(left : A) (right : B)
(metric : Metric)
(cost_fn : A → B → Metric → SilverSight.Q16_16)
(invA : A → Invariant) (invB : B → Invariant)
: Bind A B :=
let c := cost_fn left right metric
let w := Witness.lawful (invA left) (invB right)
let is_lawful := invA left = invB right -- DecidableEq on Invariant, not String equality
{ left := left, right := right, metric := metric, cost := c, witness := w, lawful := is_lawful }
def informationalBind {A B : Type} (left : A) (right : B) (metric : Metric) (cost_fn : A → B → Metric → SilverSight.Q16_16) (invA : A → Invariant) (invB : B → Invariant) : Bind A B :=
bind left right { metric with tensor := TensorType.informational } cost_fn invA invB
def geometricBind {A B : Type} (left : A) (right : B) (metric : Metric) (cost_fn : A → B → Metric → SilverSight.Q16_16) (invA : A → Invariant) (invB : B → Invariant) : Bind A B :=
bind left right { metric with tensor := TensorType.geometric } cost_fn invA invB
def thermodynamicBind {A B : Type} (left : A) (right : B) (metric : Metric) (cost_fn : A → B → Metric → SilverSight.Q16_16) (invA : A → Invariant) (invB : B → Invariant) : Bind A B :=
bind left right { metric with tensor := TensorType.thermodynamic } cost_fn invA invB
def physicalBind {A B : Type} (left : A) (right : B) (metric : Metric) (cost_fn : A → B → Metric → SilverSight.Q16_16) (invA : A → Invariant) (invB : B → Invariant) : Bind A B :=
bind left right { metric with tensor := TensorType.physical } cost_fn invA invB
def controlBind {A B : Type} (left : A) (right : B) (metric : Metric) (cost_fn : A → B → Metric → SilverSight.Q16_16) (invA : A → Invariant) (invB : B → Invariant) : Bind A B :=
bind left right { metric with tensor := TensorType.control } cost_fn invA invB
/-- Fixed-point gradient computation for bind optimization
Verified with Wolfram Alpha: adjoint = grad_phi / (s - Δ_LB) with singular protection δ=1 -/
structure BindGradient where
phi_bind : Q16_16 -- Φ_bind(x): the bind objective function
grad_phi : Q16_16 -- ∇Φ_bind(x): gradient of the objective
laplacian_lb : Q16_16 -- Δ_LB: Laplacian of load balance
scaling_param : Q16_16 -- s: scaling parameter
learning_rate : Q16_16 -- μ: learning rate
deriving Repr, Inhabited
def BindGradient.computeAdjoint (bg : BindGradient) : Q16_16 :=
let s := bg.scaling_param
let delta_lb := bg.laplacian_lb
let grad_phi := bg.grad_phi
let denom := s - delta_lb
if denom.val = 0 then zero -- Singular protection
else grad_phi / denom
def BindGradient.gradientStep (bg : BindGradient) (x : Q16_16) : Q16_16 :=
let g_adj := bg.computeAdjoint
let mu := bg.learning_rate
let adjustment := mul g_adj mu
x - adjustment
#eval BindGradient.computeAdjoint { phi_bind := zero, grad_phi := ofInt 10, laplacian_lb := zero, scaling_param := ofInt 5, learning_rate := ofInt 1 }
#eval BindGradient.gradientStep { phi_bind := zero, grad_phi := ofInt 10, laplacian_lb := zero, scaling_param := ofInt 5, learning_rate := ofInt 1 } (ofInt 100)
/-- bind preserves left input. -/
theorem bind_preservesLeft {A B : Type} (left : A) (right : B) (metric : Metric) (cost_fn : A → B → Metric → SilverSight.Q16_16) (invA : A → Invariant) (invB : B → Invariant) :
(bind left right metric cost_fn invA invB).left = left := by
unfold bind
rfl
/-- bind preserves right input. -/
theorem bind_preservesRight {A B : Type} (left : A) (right : B) (metric : Metric) (cost_fn : A → B → Metric → SilverSight.Q16_16) (invA : A → Invariant) (invB : B → Invariant) :
(bind left right metric cost_fn invA invB).right = right := by
unfold bind
rfl
/-- bind preserves metric. -/
theorem bind_preservesMetric {A B : Type} (left : A) (right : B) (metric : Metric) (cost_fn : A → B → Metric → SilverSight.Q16_16) (invA : A → Invariant) (invB : B → Invariant) :
(bind left right metric cost_fn invA invB).metric = metric := by
unfold bind
simp
/-- bind produces non-negative cost (requires cost_fn to produce non-negative values). -/
theorem bind_cost_nonNegative {A B : Type} (left : A) (right : B) (metric : Metric) (cost_fn : A → B → Metric → SilverSight.Q16_16) (invA : A → Invariant) (invB : B → Invariant)
(h_cost : cost_fn left right metric ≥ zero) :
(bind left right metric cost_fn invA invB).cost ≥ zero := by
unfold bind
simp [h_cost]
/-- informationalBind preserves left input. -/
theorem informationalBind_preservesLeft {A B : Type} (left : A) (right : B) (metric : Metric) (cost_fn : A → B → Metric → SilverSight.Q16_16) (invA : A → Invariant) (invB : B → Invariant) :
(informationalBind left right metric cost_fn invA invB).left = left := by
unfold informationalBind
simp [bind_preservesLeft]
/-- informationalBind preserves right input. -/
theorem informationalBind_preservesRight {A B : Type} (left : A) (right : B) (metric : Metric) (cost_fn : A → B → Metric → SilverSight.Q16_16) (invA : A → Invariant) (invB : B → Invariant) :
(informationalBind left right metric cost_fn invA invB).right = right := by
unfold informationalBind
simp [bind_preservesRight]
/-- Optimized bind using gradient descent
--
-- Arithmetic sanity check:
-- x_new = x - μ * (∇Φ / (s - Δ_LB)).
--
-- External CAS provenance:
-- Not Wolfram-verified in this chain. Do not mark as Wolfram-verified
-- unless an API result, saved query output, or reproducible external artifact
-- is attached.
-/
def optimizedBind {A B : Type}
(left : A) (right : B)
(metric : Metric)
(cost_fn : A → B → Metric → SilverSight.Q16_16)
(invA : A → Invariant) (invB : B → Invariant)
(gradient : BindGradient)
: Bind A B :=
let initial_bind := bind left right metric cost_fn invA invB
let optimized_cost := BindGradient.gradientStep gradient initial_bind.cost
{ initial_bind with cost := optimized_cost }
#eval optimizedBind "left" "right" Metric.euclidean (fun _ _ _ => zero) (fun s => Invariant.fromString s) (fun s => Invariant.fromString s) { phi_bind := zero, grad_phi := ofInt 10, laplacian_lb := zero, scaling_param := ofInt 5, learning_rate := ofInt 1 }
/-- Fixed-point quaternion for bind optimization
-- Arithmetic sanity check: quaternion addition and scalar multiplication
-- External CAS provenance: Not Wolfram-verified in this chain. Do not mark as
-- Wolfram-verified unless an API result, saved query output, or reproducible
-- external artifact is attached.
-/
structure Quaternion where
w : Q16_16 -- scalar part
x : Q16_16 -- i component
y : Q16_16 -- j component
z : Q16_16 -- k component
deriving Repr, Inhabited
def Quaternion.zero : Quaternion := { w := Q16_16.zero, x := Q16_16.zero, y := Q16_16.zero, z := Q16_16.zero }
def Quaternion.one : Quaternion := { w := ofInt 65536, x := Q16_16.zero, y := Q16_16.zero, z := Q16_16.zero } -- 1.0 in Q16_16
def Quaternion.add (q1 q2 : Quaternion) : Quaternion :=
{ w := Q16_16.add q1.w q2.w, x := Q16_16.add q1.x q2.x, y := Q16_16.add q1.y q2.y, z := Q16_16.add q1.z q2.z }
def Quaternion.scale (q : Quaternion) (s : Q16_16) : Quaternion :=
{ w := Q16_16.mul q.w s, x := Q16_16.mul q.x s, y := Q16_16.mul q.y s, z := Q16_16.mul q.z s }
-- #eval! Quaternion.zero
-- #eval! Quaternion.one
-- #eval! Quaternion.add Quaternion.zero Quaternion.one
-- #eval! Quaternion.scale Quaternion.one (ofInt 2)
-- Note: Quaternion definitions use sorry axioms, commenting out eval for build
/-- Fixed-point information-theoretic constraints
--
-- Arithmetic sanity check:
-- AMMR and AVMR are standard mutual information metrics.
--
-- External CAS provenance:
-- Not Wolfram-verified in this chain. Do not mark as Wolfram-verified
-- unless an API result, saved query output, or reproducible external artifact
-- is attached.
-/
structure InformationTheoreticConstraints where
ammr : Q16_16 -- Average Mean Mutual Rate
avmr : Q16_16 -- Average Variance Mutual Rate
deriving Repr, Inhabited
def InformationTheoreticConstraints.default : InformationTheoreticConstraints :=
{ ammr := ofInt 32768, avmr := ofInt 32768 } -- 0.5 in Q16_16
/-- Quaternion gradient with information constraints
--
-- Arithmetic sanity check:
-- quaternion gradient descent with mutual information adjustment.
--
-- External CAS provenance:
-- Not Wolfram-verified in this chain. Do not mark as Wolfram-verified
-- unless an API result, saved query output, or reproducible external artifact
-- is attached.
-/
structure QuaternionBindGradient where
quaternion_state : Quaternion
info_constraints : InformationTheoreticConstraints
phi_bind_q : Quaternion -- Φ_bind(q)
grad_phi_q : Quaternion -- ∇_q Φ_bind(q)
laplacian_lb : Q16_16
scaling_param : Q16_16
learning_rate : Q16_16
deriving Repr, Inhabited
def QuaternionBindGradient.computeAMMR (qbg : QuaternionBindGradient) : Q16_16 :=
let q := qbg.quaternion_state
let ammr := qbg.info_constraints.ammr
let magnitude_sq := Q16_16.mul q.w q.w + Q16_16.mul q.x q.x + Q16_16.mul q.y q.y + Q16_16.mul q.z q.z
let magnitude := sqrt magnitude_sq -- Use sqrt from FixedPoint
Q16_16.mul ammr magnitude
def QuaternionBindGradient.computeAVMR (qbg : QuaternionBindGradient) : Q16_16 :=
let q := qbg.quaternion_state
let avmr := qbg.info_constraints.avmr
let sum := Q16_16.add q.w (Q16_16.add q.x (Q16_16.add q.y q.z))
let four := ofInt 4
let mean := Q16_16.div sum four
let diff_w := Q16_16.sub q.w mean
let diff_x := Q16_16.sub q.x mean
let diff_y := Q16_16.sub q.y mean
let diff_z := Q16_16.sub q.z mean
let variance_sq := Q16_16.mul diff_w diff_w + Q16_16.mul diff_x diff_x + Q16_16.mul diff_y diff_y + Q16_16.mul diff_z diff_z
let variance := Q16_16.div variance_sq four
Q16_16.mul avmr variance
def QuaternionBindGradient.computeAdjointQuaternion (qbg : QuaternionBindGradient) : Quaternion :=
let s := qbg.scaling_param
let delta_lb := qbg.laplacian_lb
let grad_phi_q := qbg.grad_phi_q
let denom := Q16_16.sub s delta_lb
if denom.val = 0 then Quaternion.zero
else Quaternion.scale grad_phi_q (Q16_16.div one denom)
def QuaternionBindGradient.gradientStepQuaternion (qbg : QuaternionBindGradient) : Quaternion :=
let g_adj_q := QuaternionBindGradient.computeAdjointQuaternion qbg
let mu := qbg.learning_rate
let current_q := qbg.quaternion_state
let neg_mu := Q16_16.sub Q16_16.zero mu
let neg_mu_g_adj := Quaternion.scale g_adj_q neg_mu
Quaternion.add current_q neg_mu_g_adj
#eval! InformationTheoreticConstraints.default
-- #eval! QuaternionBindGradient.computeAMMR { quaternion_state := Quaternion.one, info_constraints := InformationTheoreticConstraints.default, phi_bind_q := Quaternion.zero, grad_phi_q := Quaternion.zero, laplacian_lb := Q16_16.zero, scaling_param := ofInt 5, learning_rate := ofInt 1 }
-- #eval! QuaternionBindGradient.computeAVMR { quaternion_state := Quaternion.one, info_constraints := InformationTheoreticConstraints.default, phi_bind_q := Quaternion.zero, grad_phi_q := Quaternion.zero, laplacian_lb := Q16_16.zero, scaling_param := ofInt 5, learning_rate := ofInt 1 }
-- Note: Quaternion definitions use sorry axioms, commenting out eval for build
/-- Quaternion-optimized bind with information-theoretic adjustment
--
-- Arithmetic sanity check:
-- cost_adjusted = cost + (AMMR + AVMR) × 100.
--
-- External CAS provenance:
-- Not Wolfram-verified in this chain. Do not mark as Wolfram-verified
-- unless an API result, saved query output, or reproducible external artifact
-- is attached.
-/
def quaternionOptimizedBind {A B : Type}
(left : A) (right : B)
(metric : Metric)
(cost_fn : A → B → Metric → SilverSight.Q16_16)
(invA : A → Invariant) (invB : B → Invariant)
(q_gradient : QuaternionBindGradient)
: Bind A B :=
let initial_bind := bind left right metric cost_fn invA invB
let ammr_val := QuaternionBindGradient.computeAMMR q_gradient
let avmr_val := QuaternionBindGradient.computeAVMR q_gradient
let info_sum := Q16_16.add ammr_val avmr_val
let hundred := ofInt 100
let info_adjustment := Q16_16.mul info_sum hundred
let optimized_cost := Q16_16.add initial_bind.cost info_adjustment
{ initial_bind with cost := optimized_cost }
-- #eval! quaternionOptimizedBind "left" "right" Metric.euclidean (fun _ _ _ => zero) (fun s => s) (fun s => s) { quaternion_state := Quaternion.one, info_constraints := InformationTheoreticConstraints.default, phi_bind_q := Quaternion.zero, grad_phi_q := Quaternion.zero, laplacian_lb := zero, scaling_param := ofInt 5, learning_rate := ofInt 1 }
-- Note: Quaternion definitions use sorry axioms, commenting out eval for build
end SilverSight