情報科学 › ソフトウェア設計とテスト › 契約による設計

抽象化関数が操作と可換なら実装は仕様を満たす

命題 6.4(「契約による設計」§6) ・ ✓公理まで証明済み

抽象仕様として、抽象値の集合 AA、初期値 a0∈Aa_0 \in A、各 m∈Opm \in \mathrm{Op} の事前条件 premA⊆A×Xm\mathrm{pre}^A_m \subseteq A \times X_m と写像 opmA:A×Xm→A×Ym\mathrm{op}^A_m : A \times X_m \to A \times Y_m が与えられているとする。データ型の実装 (Rep,Init,(opm))(\mathrm{Rep}, \mathrm{Init}, (\mathrm{op}_m))、表現不変条件 Inv\mathrm{Inv}、抽象化関数 α:Inv→A\alpha : \mathrm{Inv} \to A が次を満たすとする。

  • (初期値)Init⊆Inv\mathrm{Init} \subseteq \mathrm{Inv} で、すべての r∈Initr \in \mathrm{Init} について α(r)=a0\alpha(r) = a_0。
  • (可換性)すべての mm、r∈Invr \in \mathrm{Inv}、x∈Xmx \in X_m について、(α(r),x)∈premA(\alpha(r), x) \in \mathrm{pre}^A_m かつ opm(r,x)=(r′,y)\mathrm{op}_m(r, x) = (r', y) ならば、r′∈Invr' \in \mathrm{Inv} かつ opmA(α(r),x)=(α(r′),y)\mathrm{op}^A_m(\alpha(r), x) = (\alpha(r'), y)。

操作の列 (m1,x1),…,(mN,xN)(m_1, x_1), \ldots, (m_N, x_N) を、抽象仕様の側で a0a_0 から順に実行した抽象値と結果を aia_i、yiAy^A_i(opmiA(ai−1,xi)=(ai,yiA)\mathrm{op}^A_{m_i}(a_{i-1}, x_i) = (a_i, y^A_i))とし、各段で事前条件 (ai−1,xi)∈premiA(a_{i-1}, x_i) \in \mathrm{pre}^A_{m_i} が成り立つとする。同じ列を実装の側で r0∈Initr_0 \in \mathrm{Init} から順に実行した表現と結果を rir_i、yiy_i(opmi(ri−1,xi)=(ri,yi)\mathrm{op}_{m_i}(r_{i-1}, x_i) = (r_i, y_i))とする。このとき、すべての ii について

ri∈Inv,α(ri)=ai,yi=yiA(i≥1)r_i \in \mathrm{Inv}, \qquad \alpha(r_i) = a_i, \qquad y_i = y^A_i \quad (i \ge 1)

が成り立つ。すなわち、呼び出し側が観測する結果の列は、抽象仕様のものと一致する。

本文で読む(証明と前後の説明)→

閉包の状態

✓ 公理まで証明済み

証明が使う定理を 前提 としてたどると、Rikai の中の証明だけで定義・公理(物理では基本仮定)までつながっています(前提の定理類 2 件、定義なども含めて 3 件)。

印の意味: ✓公理まで証明済み ・ △証明あり(閉包未完)・ ※主張のみ。テーマごとの集計は 閉包の状況。

前提をたどる 証明が使う定理・定義(直接 1 件)

▸ を開くと、その項目の証明が使う前提が出ます。深い先は各項目のページでたどれます。

これを使っている定理 証明で参照している 1 件

関連するノック 1 問