Skip to content

JPYC.add?_sub?_cancel

名称・種別

  • 名称: JPYC.add?_sub?_cancel
  • 種別: theorem
  • モジュール: JpycFormalVerification.Word
  • ソース: JpycFormalVerification/Word.lean:90-98
  • 概要: a+b が c で成功するなら c−b は a に戻る、という往復(借方→貸方)補題。
  • 仕様: 対象

型シグネチャ

lean
∀ {a b c : JPYC.U256}, Eq (JPYC.add? a b) (Except.ok c) → Eq (JPYC.sub? c b) (Except.ok a)

a + b が結果 c として成功するなら、c - b は成功して a を返す」という定理です。足してから引けば元に戻る

和訳 docstring

a + b が結果 c で成功するなら、c - b は成功して a を返す。API の完全性のために用意したもので、実際に下流(_transfer_self)で使われるのは双対の sub?_add?_cancel のほう。この向きは下流では使われていない。

解説

何を述べているか。 checked 加算と減算の round-trip(往復)相殺 です。

直感。 あふれずに足せたのなら、同じ量を引けば確実に元の値に戻る、ということです。

なぜ安全性に効くか。 checked 加減算の往復が成り立つことは、供給保存(足した分はちゃんと引いて回収できる)を扱う基盤です。証明は add?_eq_oksub?_of_leBitVec.add_sub_cancel を組み合わせます。なお実際に下流(_transfer_self の証明内)で使われるのは双対の sub?_add?_cancel のほうで、この add?_sub?_cancel 自体は API 完全性(往復の両向きを揃える)のために置いてあり、現状の証明では直接は使われていません。

図解

Lean ソースコード

lean
/-- If `a + b` succeeds with result `c`, then `c - b` succeeds and returns `a`.
Provided for API completeness — the dual `sub?_add?_cancel` is the direction
actually used downstream (in `_transfer_self`); this one has no downstream use. -/
theorem add?_sub?_cancel {a b c : U256} (h : add? a b = .ok c) :
    sub? c b = .ok a := by
  obtain ⟨rfl, hlt⟩ := add?_eq_ok h
  have hb : b.toNat < 2 ^ 256 := b.isLt
  have hle : b.toNat ≤ (a + b).toNat := by rw [BitVec.toNat_add]; omega
  rw [sub?_of_le hle, BitVec.add_sub_cancel]

依存