Skip to content

JPYC.sub?_toNat

名称・種別

  • 名称: JPYC.sub?_toNat
  • 種別: theorem
  • モジュール: JpycFormalVerification.Word
  • ソース: JpycFormalVerification/Word.lean:72-78
  • 概要: 成功した sub? は自然数減算と一致する、という補題。
  • 仕様: 対象

型シグネチャ

lean
∀ {a b r : JPYC.U256}, Eq (JPYC.sub? a b) (Except.ok r) → Eq (BitVec.toNat r) (instHSub.hSub (BitVec.toNat a) (BitVec.toNat b))

sub? a b = .ok r ならば r.toNat = a.toNat - b.toNat」という定理です。成功時には、結果の自然数値が自然数の差に一致します。

和訳 docstring

成功した sub? は(切り捨てだが、ここでは正確な)自然数の減算と一致する。

解説

何を述べているか。 減算が成功したなら、結果の自然数値は自然数の差に一致する、という主張です。

直感。 b ≤ a が成り立つので、自然数の切り捨て減算(負にならないよう 0 で止まる引き算)も、ここでは正確な引き算と同じ結果になります。

なぜ安全性に効くか。 供給保存や残高計算で、ビット表現と自然数表現を橋渡しします。証明は sub?_eq_okBitVec.toNat_subomega を使います。

図解

Lean ソースコード

lean
/-- A successful `sub?` agrees with (truncated, but here exact) natural-number
subtraction. -/
theorem sub?_toNat {a b r : U256} (h : sub? a b = .ok r) :
    r.toNat = a.toNat - b.toNat := by
  obtain ⟨rfl, hle⟩ := sub?_eq_ok h
  have ha : a.toNat < 2 ^ 256 := a.isLt
  rw [BitVec.toNat_sub]; omega

依存