Encyclopedia Foundation Foundation Ledger Forcing Log Reciprocal Cancel

ARTICLE 3 claims 2 theorems 1 model

Foundation Ledger Forcing Log Reciprocal Cancel

A simple logarithm identity about reciprocals anchors the framework's claim that recognition events must come in balanced pairs.

The cancellation identity

In mathematics, the logarithm of a reciprocal is the negative of the logarithm of the original number. For any positive real number r, the identity log(r) + log(1/r) = 0 holds. This is a standard property of logarithms, taught in introductory calculus. It means that if one quantity is the reciprocal of another, their logarithms cancel when added together. The identity is exact and holds for every positive real number, with no exceptions or hidden conditions.

The Recognition Science framework builds on this elementary fact. Within the framework, a recognition event is a discrete record of one agent recognizing another, carrying a positive real ratio. The framework defines a ledger as a discrete record of such events, and it requires that every event in a ledger has its reciprocal event also present. The declaration log_reciprocal_cancel establishes, in the framework's machine-checked library of formal theorems, that the logarithm of an event's ratio plus the logarithm of its reciprocal's ratio equals zero. This is the same elementary identity, applied to the ratio carried by a recognition event and its reciprocal.

The consequence is a conservation property. The framework defines the net flow for an agent as the sum of logarithms of ratios for events where that agent is a source or target. Because each event's reciprocal cancels its logarithm, the net flow through any agent in a balanced ledger is zero. The framework proves this as conservation_from_balance. This means that in a ledger where every event has its reciprocal, nothing is lost or gained in logarithmic terms; the ledger balances exactly.

The identity itself is not a deep or novel mathematical result. It is a restatement of a standard logarithm property, and the framework's proof is a direct application of that property. What the framework contributes is the interpretation: this cancellation is what makes double-entry bookkeeping structure forced rather than optional. The declaration does not prove that any physical system obeys this structure, nor does it derive the cost function J or any other framework constant. It establishes one algebraic fact about logarithms and shows how that fact supports the ledger's balance condition.

THEOREM log_reciprocal_cancel · IndisputableMonolith/Foundation/LedgerForcing.lean
/-- Log reciprocal cancellation: log(r) + log(1/r) = 0. -/
theorem log_reciprocal_cancel {r : ℝ} (_hr : r > 0) : Real.log r + Real.log (r⁻¹) = 0 := by
  rw [Real.log_inv]; ring
MODEL Ledger · IndisputableMonolith/Foundation/LedgerForcing.lean
/-- A ledger is a collection of recognition events with double-entry constraint. -/
structure Ledger where
  events : List RecognitionEvent
  double_entry : balanced_list events
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

What this page does not claim

The identity log(r) + log(1/r) = 0 is a standard logarithm property, not a novel framework result. The declaration does not prove that any physical system actually obeys the balanced ledger structure. The declaration does not derive the cost function J or any other framework constant.

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