JPYC.sum_double_update_nat
名称・種別
- 名称:
JPYC.sum_double_update_nat - 種別: theorem
- モジュール:
JpycFormalVerification.ERC20Theorems - ソース:
JpycFormalVerification/ERC20Theorems.lean:234-253 - 概要: 二点を書き換えても対の合計が不変なら、有限和の総計も不変である、という補題。
- 仕様: 対象外
型シグネチャ
lean
∀ {F : JPYC.Address → Nat} {i j : JPYC.Address} {x y : Nat}, Ne i j → Eq (instHAdd.hAdd x y) (instHAdd.hAdd (F i) (F j)) → Eq (Finset.univ.sum fun a => Function.update (Function.update F i x) j y a) (Finset.univ.sum fun a => F a)有限なアドレス空間上で、関数 F の 2 点 i, j(相異なる)を x, y に書き換えたとき、もし x + y = F i + F j ならば総和は変わらない、という補題です。
和訳 docstring
相異なる 2 点を、合計を保ったまま書き換えても、有限和は変わらない。
解説
何を述べているか。 全アドレスにわたる総和 ∑ a, F a について、相異なる 2 点だけを書き換えても、その 2 点の合計が保たれていれば(x + y = F i + F j)、総和全体は不変だと示します。
直感。 「A から B へお金を移しても、A と B の合計が同じなら全体の合計は変わらない」という、会計の基本そのものです。証明は Finset.sum_update_of_mem で 2 点を総和から括り出し、残りは omega で潰します。
なぜ安全性に効くか。 これが SupplyConserved の数学的な心臓です。送金は送り手と受け手の残高だけを、合計を保ちながら動かすので、この補題により総供給(= 全残高の和)が不変だと結論できます。お金が湧かず消えないことの根拠です。
図解
Lean ソースコード
lean
/-- Sum (over the finite address space) of a function with two distinct points
reset: if the new pair-total equals the old pair-total, the grand total is
unchanged. -/
theorem sum_double_update_nat {F : Address → ℕ} {i j : Address} {x y : ℕ}
(hij : i ≠ j) (hxy : x + y = F i + F j) :
∑ a, Function.update (Function.update F i x) j y a = ∑ a, F a := by
have hi : i ∈ (Finset.univ : Finset Address) \ {j} := by simp [hij]
have key : ∀ (p q : ℕ),
∑ a, Function.update (Function.update F i p) j q a
= q + (p + ∑ a ∈ ((Finset.univ : Finset Address) \ {j}) \ {i}, F a) := by
intro p q
rw [Finset.sum_update_of_mem (Finset.mem_univ j), Finset.sum_update_of_mem hi]
have hrhs : ∑ a, F a
= F j + (F i + ∑ a ∈ ((Finset.univ : Finset Address) \ {j}) \ {i}, F a) := by
rw [← key (F i) (F j)]
have hself : Function.update (Function.update F i (F i)) j (F j) = F := by
rw [Function.update_eq_self, Function.update_eq_self]
rw [hself]
rw [key x y, hrhs]
omega