Skip to content

JPYC.add?_toNat

名称・種別

  • 名称: JPYC.add?_toNat
  • 種別: theorem
  • モジュール: JpycFormalVerification.Word
  • ソース: JpycFormalVerification/Word.lean:54-58
  • 概要: 成功した add? は自然数加算と一致する(ラップアラウンドしない)、という補題。
  • 仕様: 対象

型シグネチャ

lean
∀ {a b r : JPYC.U256}, Eq (JPYC.add? a b) (Except.ok r) → Eq (BitVec.toNat r) (instHAdd.hAdd (BitVec.toNat a) (BitVec.toNat b))

add? a b = .ok r ならば r.toNat = a.toNat + b.toNat」という定理です。成功時には、ビット演算の結果と自然数の和が一致します。

和訳 docstring

成功した add? は自然数の加算と一致する(ラップアラウンドなし)。

解説

何を述べているか。 加算が成功したなら、結果を自然数に直したものは元の自然数和に 完全一致 する(途中で 2^256 を法とした丸めが起きない)、という主張です。

直感。「あふれていない」のだから、ビット演算の結果は普通の足し算と同じになる、ということです。

なぜ安全性に効くか。 残高合計などを自然数で扱う供給保存の証明で、ビットの世界と自然数の世界を安全に行き来するための橋です。証明は add?_eq_ok を使い、BitVec.toNat_addomega で締めます。

図解

Lean ソースコード

lean
/-- A successful `add?` agrees with natural-number addition (no wraparound). -/
theorem add?_toNat {a b r : U256} (h : add? a b = .ok r) :
    r.toNat = a.toNat + b.toNat := by
  obtain ⟨rfl, hlt⟩ := add?_eq_ok h
  rw [BitVec.toNat_add]; omega

依存