Skip to content

JPYC.add?_eq_ok

名称・種別

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

型シグネチャ

lean
∀ {a b r : JPYC.U256}, Eq (JPYC.add? a b) (Except.ok r) → And (Eq r (instHAdd.hAdd a b)) (instLTNat.lt (instHAdd.hAdd (BitVec.toNat a) (BitVec.toNat b)) (instHPow.hPow 2 256))

add? a b = .ok r ならば、r = a + b かつ 和は 256 ビットに収まる」という定理です。成功という結果から、その内訳を取り出します。

解説

何を述べているか。 add? が成功したとき、その結果 r が和に等しく、かつオーバーフローしていなかったことを取り出す 除去(elimination)補題 です。

直感。「成功した」という事実から、逆に「条件が満たされていた/結果が何だったか」を読み出します。証明では add? を展開して if を場合分け(split)するだけです。

なぜ安全性に効くか。 多くの上位証明が「add? が成功した」という仮定から「和が収まっていた・結果は和だ」を引き出すのに使う、中心的な補題です。add?_toNat もこれを経由します。

図解

Lean ソースコード

lean
theorem add?_eq_ok {a b r : U256} (h : add? a b = .ok r) :
    r = a + b ∧ a.toNat + b.toNat < 2 ^ 256 := by
  unfold add? at h; split at h <;> simp_all

依存