Encyclopedia Foundation Foundation Ledger Forcing Conservation From Balance
ARTICLE 3 claims 3 theorems
Foundation Ledger Forcing Conservation From Balance
A proved theorem in the framework's machine-checked library shows that a balanced double-entry ledger has zero net flow for every agent: conservation follows from balance alone.
Conservation from balance
In the Recognition Science framework, a ledger is a discrete record of events, each event being a directed exchange between two agents with a positive real ratio. The framework's machine-checked library of formal theorems proves a structural result: any ledger that is balanced, meaning every event appears with its reciprocal counterpart, has zero net flow for every agent. The theorem, named conservation_from_balance, states that for any balanced ledger and any agent, the net flow is exactly zero.
Net flow is defined as the sum of logarithms of ratios for all events touching an agent, with outgoing events counted positively and incoming events negatively. The proof rests on the reciprocal structure: each event's reciprocal has the inverse ratio, so the logarithms cancel in pairs. The theorem also shows that the empty ledger is balanced and has zero net flow, and that adding an event together with its reciprocal preserves balance. The cost function J(x) = (x + x⁻¹)/2 - 1 is symmetric under reciprocation, which forces the double-entry structure.
This is a purely formal result about the framework's definitions. It does not claim that physical conservation laws such as energy or momentum are derived, nor that any real-world accounting system must obey this structure. The theorem establishes an internal consistency: within the framework's model, balance implies conservation. It is a theorem about the framework's own objects, not about empirical reality.
THEOREM conservation_from_balance · IndisputableMonolith/Foundation/LedgerForcing.lean
/-- **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_balanced · empty_ledger_net_flow · IndisputableMonolith/Foundation/LedgerForcing.lean
/-- The empty ledger is balanced. -/
theorem empty_ledger_balanced : balanced empty_ledger := empty_ledger.double_entry
/-- The empty ledger has zero net flow. -/
theorem empty_ledger_net_flow (agent : ℕ) : net_flow empty_ledger agent = 0 := by
simp [net_flow, empty_ledger]
THEOREM J_symmetric · 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
What this page does not claim
The theorem does not derive physical conservation laws such as energy or momentum conservation. The theorem does not claim that real-world accounting or economic systems must follow this structure. The theorem does not establish that the framework's model corresponds to empirical reality.
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:
- How does the framework connect this formal conservation result to physical conservation laws?
- What empirical evidence, if any, supports the claim that real recognition processes follow this ledger structure?
- Does the framework's definition of balance allow for any meaningful deviation from double-entry structure?
MACHINE LAYER · GROUNDED CLAIM TABLE · CLICK TO EXPAND
THEOREM conservation_from_balance · IndisputableMonolith/Foundation/LedgerForcing.lean
/-- **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_zeroany ledger that is balanced, meaning every event appears with its reciprocal counterpart, has zero net flow for every agent conservation_from_balance · IndisputableMonolith/Foundation/LedgerForcing.leanTHEOREM empty_ledger_balanced · empty_ledger_net_flow · IndisputableMonolith/Foundation/LedgerForcing.lean
/-- The empty ledger is balanced. -/ theorem empty_ledger_balanced : balanced empty_ledger := empty_ledger.double_entry/-- The empty ledger has zero net flow. -/ theorem empty_ledger_net_flow (agent : ℕ) : net_flow empty_ledger agent = 0 := by simp [net_flow, empty_ledger]the empty ledger is balanced and has zero net flow empty_ledger_balanced · empty_ledger_net_flow · IndisputableMonolith/Foundation/LedgerForcing.leanTHEOREM J_symmetric · 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]; ringthe cost function J(x) = (x + x⁻¹)/2 - 1 is symmetric under reciprocation J_symmetric · IndisputableMonolith/Foundation/LedgerForcing.lean