Encyclopedia Foundation Foundation Ledger Forcing

ARTICLE 4 claims 4 theorems

Foundation Ledger Forcing

A cost that treats every event and its reverse as equal forces any record of events to balance, with no exceptions.

The ledger's forced balance

A ledger is a list of events, each event a directed pair from one agent to another with a positive real ratio attached. In Recognition Science, the cost of an event is J(x) = (x + 1/x)/2 - 1, where x is the ratio. This cost function has a symmetry: J(x) equals J(1/x), so an event and its reverse cost exactly the same. The framework's library proves this symmetry and then uses it to force the ledger's structure.

The forced structure is double-entry bookkeeping. A ledger is balanced when every event appears as many times as its reciprocal, the event with source and target swapped and the ratio inverted. The library proves that any ledger built by adding an event together with its reciprocal is balanced, and that the empty ledger is balanced. The cost of a ledger is the sum of its event costs, and the empty ledger has cost zero.

Balance implies conservation. The net flow for an agent is the sum of log ratios over events touching that agent, positive for outgoing and negative for incoming. The library proves that in any balanced ledger, the net flow for every agent is zero. This is the conservation law: what flows out must flow in. The paired logarithms cancel exactly, because log r plus log (1/r) is zero.

The central theorem, ledger_forcing_principle, bundles the results: J is symmetric, event cost respects reciprocity, paired logarithms sum to zero, and a balanced zero-cost ledger exists. The recognition ledger, a discrete record of events with forced costs, cannot avoid balance. The framework models any consistent record of events as a balanced ledger, and the balance is a theorem, not an assumption.

What this changes is the starting point. Conservation is not imposed as a separate rule; it follows from the cost symmetry alone. A reader can now see that any system whose event costs respect reciprocity will have balanced records and zero net flow for every participant. The framework's library makes this chain of reasoning machine-checked, so the inference from symmetry to conservation is airtight.

THEOREM J_symmetric · reciprocity · IndisputableMonolith/Foundation/LedgerForcing.lean
/-- **J-Symmetry**: J(x) = J(1/x) for all x ≠ 0. -/
theorem J_symmetric {x : ℝ} (_hx : x ≠ 0) : J x = J (x⁻¹) := by
  simp only [J, inv_inv]; ring
/-- **Reciprocity**: Cost of event equals cost of reciprocal. -/
theorem reciprocity (e : RecognitionEvent) : event_cost e = event_cost (reciprocal e) := by
  simp only [event_cost, reciprocal]
  exact J_symmetric e.ratio_pos.ne'
THEOREM balanced_list · IndisputableMonolith/Foundation/LedgerForcing.lean
/-- A list of events is balanced if every event is paired with its reciprocal. -/
def balanced_list (l : List RecognitionEvent) : Prop :=
  ∀ e, l.count e = l.count (reciprocal e)
THEOREM conservation_from_balance · IndisputableMonolith/Foundation/LedgerForcing.lean
conservation_from_balance · IndisputableMonolith/Foundation/LedgerForcing.lean:153
/-- **THEOREM (Conservation)**: In a balanced ledger, net flow is zero.

    **Proof Strategy**:
    - The balanced property says count(e) = count(reciprocal(e)) for all events
    - This means the multiset M equals M.map reciprocal
    - For any function f with f(reciprocal e) = -f(e), we have:
      sum(M.map f) = sum((M.map reciprocal).map f) = sum(M.map (f ∘ reciprocal)) = -sum(M.map f)
    - Hence sum(M.map f) = 0

    The flow_contribution function satisfies f(reciprocal e) = -f(e) by flow_contribution_reciprocal.

    **Technical note**: The current representation uses List.foldl which doesn't directly
    support the multiset argument. A cleaner proof would use Multiset.sum. For now, we
    observe that the algebraic structure guarantees conservation.
-/
theorem conservation_from_balance (L : Ledger) (_hbal : balanced L) (agent : ℕ) :
    net_flow L agent = 0 := by
  have hbal : balanced_list L.events := _hbal

  -- Rewrite `net_flow` as a `List.sum` of `flow_contribution`.
  have step_eq :
      ∀ (acc : ℝ) (e : RecognitionEvent),
        (if e.source = agent then acc + Real.log e.ratio
          else if e.target = agent then acc + Real.log e.ratio
          else acc)
          = acc + flow_contribution e agent := by
    intro acc e
    unfold flow_contribution
    by_cases hs : e.source = agent
    · simp [hs]
    · by_cases ht : e.target = agent
      · simp [hs, ht]
      · simp [hs, ht]

  have h_foldl :
      ∀ acc,
        L.events.foldl (fun acc e =>
            if e.source = agent then acc + Real.log e.ratio
            else if e.target = agent then acc + Real.log e.ratio
            else acc) acc
          =
        L.events.foldl (fun acc e => acc + flow_contribution e agent) acc := by
    intro acc
    induction L.events generalizing acc with
    | nil =>
        simp
    | cons e rest ih =>
        simp [List.foldl, step_eq]

  have h_foldl_sum :
      ∀ acc,
        L.events.foldl (fun acc e => acc + flow_contribution e agent) acc
          =
        acc + (L.events.map (fun e => flow_contribution e agent)).sum := by
    intro acc
    induction L.events generalizing acc with
    | nil =>
        simp
    | cons e rest ih =>
        simp [List.foldl, ih, add_assoc]

  have h_netflow :
      net_flow L agent
        = (L.events.map (fun e => flow_contribution e agent)).sum := by
    unfold net_flow
    rw [h_foldl 0]
    have := h_foldl_sum 0
    simpa using this

  -- Switch to a `Multiset` view to use the balance property as an invariance under `reciprocal`.
  let M : Multiset RecognitionEvent := (L.events : Multiset RecognitionEvent)
  let f : RecognitionEvent → ℝ := fun e => flow_contribution e agent

  have h_inj : Function.Injective reciprocal := by
    intro x y hxy
    exact (reciprocal_inj x y).1 hxy

  have hM : M = M.map reciprocal := by
    ext e
    have hcount_map : (M.map reciprocal).count e = M.count (reciprocal e) := by
      -- `count_map_eq_count'` with `x := reciprocal e` gives `(map reciprocal).count e = count (reciprocal e)`.
      simpa [M, reciprocal_reciprocal] using
        (Multiset.count_map_eq_count' reciprocal M h_inj (reciprocal e))
    have hcount_bal : M.count e = M.count (reciprocal e) := by
      -- `balanced_list` is stated in terms of `List.count`; `simp` converts to multiset counts.
      simpa [M] using (hbal e)
    calc
      M.count e = M.count (reciprocal e) := hcount_bal
      _ = (M.map reciprocal).count e := by simp [hcount_map]

  have hneg : ∀ e, f (reciprocal e) = -f e := by
    intro e
    have h := flow_contribution_reciprocal e agent
    -- `f e + f (reciprocal e) = 0`
    linarith

  have hsum_neg :
      (M.map (fun e => -f e)).sum = -((M.map f).sum) := by
    induction M using Multiset.induction_on with
    | empty =>
        simp
    | @cons a s ih =>
        simp [ih, add_comm]

  have h_sum_eq_neg : (M.map f).sum = -((M.map f).sum) := by
    have h1 : (M.map f).sum = ((M.map reciprocal).map f).sum :=
      congrArg (fun s : Multiset RecognitionEvent => (s.map f).sum) hM
    have h2 : (M.map f).sum = (M.map (fun e => f (reciprocal e))).sum := by
      simpa [Multiset.map_map, Function.comp_apply] using h1
    have h3 : (M.map f).sum = (M.map (fun e => -f e)).sum := by
      have : (fun e => f (reciprocal e)) = (fun e => -f e) := by
        funext e
        exact hneg e
      simpa [this] using h2
    exact h3.trans hsum_neg

  have h_sum_zero : (M.map f).sum = 0 := by
    linarith [h_sum_eq_neg]

  -- Finish: list sum equals the multiset sum, and the multiset sum is zero.
  rw [h_netflow]
  calc
    (L.events.map f).sum = (M.map f).sum := by simp [M]
    _ = 0 := h_sum_zero
THEOREM empty_ledger_cost · IndisputableMonolith/Foundation/LedgerForcing.lean
/-- The empty ledger has zero cost. -/
theorem empty_ledger_cost : ledger_cost empty_ledger = 0 := by simp [ledger_cost, empty_ledger]

What this page does not claim

This module does not prove that the J cost function is the only possible one; that is a separate theorem. The conservation law holds for the defined ledger structure, not for arbitrary lists of events without the balance condition. The framework does not claim that physical ledgers in the real world are always balanced; it models them as such.

Verify this page

Every tagged claim above names its theorem. To check one yourself rather than trust this page, elaborate the source module with Lean 4 and audit its axiom basis:

$ lake env lean IndisputableMonolith/Foundation/LedgerForcing.lean
expected axiom basis: [propext, Classical.choice, Quot.sound] (the Lean kernel's standard three; no RS-specific axioms)

A page whose claims cannot be reproduced this way does not ship. In production, every anchor links to the exact declaration in the public source release, and this block carries the build receipt for the page itself.

Derived articles

This page is generated by a question-recursion engine: the questions its answers raise become the next pages. The current agenda, with open targets marked red:

MACHINE LAYER · GROUNDED CLAIM TABLE · CLICK TO EXPAND