Skip to content

JPYC.sub?_eq_ok

名称・種別

  • 名称: JPYC.sub?_eq_ok
  • 種別: theorem
  • モジュール: JpycFormalVerification.Word
  • ソース: JpycFormalVerification/Word.lean:68-70
  • 概要: sub? が成功したなら結果は通常の差であり桁借りしていない、という補題。
  • 仕様: 対象

型シグネチャ

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

sub? a b = .ok r ならば、r = a - b かつ b ≤ a」という定理です。成功という結果から内訳を取り出します。

解説

何を述べているか。 sub? が成功したとき、結果 r が差に等しく、かつ b ≤ a(引けた)であったことを取り出す 除去補題 です。

直感。「成功した」事実から逆に「引けた・結果は差」を読み出します。証明は sub? を展開して場合分けするだけです。

なぜ安全性に効くか。「残高から value を引けた」という仮定から「value ≤ 残高」を導く、アンダーフロー無し(No underflow) 性の中核部品です。sub?_toNat もこれを経由します。

図解

Lean ソースコード

lean
theorem sub?_eq_ok {a b r : U256} (h : sub? a b = .ok r) :
    r = a - b ∧ b.toNat ≤ a.toNat := by
  unfold sub? at h; split at h <;> simp_all

依存