Skip to content

JPYC.instFintypeBitVec

名称・種別

  • 名称: JPYC.instFintypeBitVec
  • 種別: instance
  • モジュール: JpycFormalVerification.State
  • ソース: JpycFormalVerification/State.lean:26-36
  • 概要: 任意の BitVec が有限型であることを与えるインスタンス。総供給=Σ残高 の表現に必要。
  • 仕様: 対象

型シグネチャ

lean
(w : Nat) → Fintype (BitVec w)

(w : Nat) → Fintype (BitVec w):任意のビット幅 w について、BitVec w有限型(Fintype であることを与えるインスタンスです。

和訳 docstring

すべての BitVec w は有限。この Mathlib 版では提供されていないが、Address(= BitVec 160)を Fintype にし、全体不変条件 totalSupply = Σ balances を表現可能にするために必要。将来 Mathlib が Fintype (BitVec w) インスタンスを追加した場合にそちらが優先され、インスタンスの diamond が生じないよう low 優先度を付けている。

解説

何を述べているか。BitVec w には 2^w 個しか値がない」、つまり 有限である ことを Lean に教えるインスタンスです。Fin (2^w) との同型(Equiv)を介して構成しています。

直感。 型クラスのインスタンスは、必要なときに自動的に使われる「裏方」です。普段は意識しませんが、これがないと次の総和が書けません。

なぜ安全性に効くか。 無限にありうるアドレス全体にわたる残高の総和 ∑ a : Address, balances a有限和 として定義できるのは、Address が有限型だからです。これが State.totalBalancesSupplyConserved(供給保存)を表現するための前提になっています。

なお、このインスタンスには (priority := low) を付けています。現状 Fintype (BitVec w) を与える候補は他に無いので解決には影響しませんが、将来 Mathlib が同名のインスタンスを追加しても、そちらが優先されてインスタンスの衝突(diamond)が起きないようにするための予防的な配慮です。

図解

Lean ソースコード

lean
/-- Every `BitVec w` is finite. Not provided by this Mathlib version, but needed
so that `Address` (= `BitVec 160`) is a `Fintype` and the global
`totalSupply = Σ balances` invariant is expressible. Given a `low` priority so
that a future Mathlib `Fintype (BitVec w)` instance, if one is ever added, is
preferred and no instance diamond arises. -/
instance (priority := low) instFintypeBitVec (w : Nat) : Fintype (BitVec w) :=
  Fintype.ofEquiv (Fin (2 ^ w))
    { toFun := BitVec.ofFin
      invFun := BitVec.toFin
      left_inv := fun _ => rfl
      right_inv := fun _ => rfl }

依存

(なし)