付録C:記法対照表

本付録では、形式的手法で頻出する用語・記号の最小セットと、AI 時代のDoDチェックリストをまとめます。

C.1 用語集(Glossary)

  • invariant(不変条件):常に成り立つべき性質。反例が出たら仕様/実装の破綻を示す。
  • safety(安全性):悪いことが起きない性質(例:二重引き落としが起きない)。
  • liveness(活性):良いことがいつか起きる性質(例:要求がいつか処理される)。
  • refinement(詳細化):抽象仕様から具体仕様へ設計を進めつつ、refinement mapping と内部変数の隠蔽を考慮した具体仕様の振る舞いが抽象仕様を満たすことを示す手続き。含意は概念的に ConcreteSpec => AbstractSpec の方向になる。
  • contract(契約):事前条件/事後条件を明文化した実行時/検証時のガード。
  • trace(トレース):状態遷移の列。反例はトレースとして提示される。
  • counterexample(反例):性質が破れる最小の実行例。設計修正の入口。
  • authentication(認証):受理した相手、message、session等が対応する正規eventに結び付くというtrace property。non-injectiveかinjectiveかを明示する。
  • attack trace(攻撃トレース):攻撃者の知識獲得、message操作、protocol eventを含む性質違反trace。

C.1.1 SAT / UNSAT と証跡の最小対応

状況 主に残すもの 独立再検査で確認すること それだけでは保証しないもの
SAT model / witness 同じエンコード問題に対して割当てが制約を満たすこと 自然言語要件、元仕様、エンコーダの妥当性
UNSAT proof certificate checker / kernel が元入力に対して証跡を受理すること 要件妥当性、未モデル化仮定、前処理全体の正しさ
unknown / timeout ログ、resource 制約、入力 hash 成功ではなく、調査対象であること 正しさ、不具合不在

C.2 AI 時代のDoDチェックリスト

AI 支援開発では、出力の正当性を検証器で担保することが前提です。

  • 仕様差分がある場合、対応する形式仕様も更新されている
  • 検証ログに seed/深さ/スコープ/実行コマンドが含まれている
  • 反例が出た場合、修正履歴と再検証ログが残っている
  • 例外承認の理由・代替策・フォローアップ期限が明記されている

C.3 記法対照表(Z / Alloy / CSP / TLA+)

以下は「同じ概念」を各記法でどう表現するかの最小対応表です。章内の表記(第4章 Alloy、第5章Z、第6章CSP、第7章 TLA+)と整合する範囲で記載します。

コードブロックのラベル:

  • ツール準拠(そのまま動く):そのままツール/CLIへ貼り付けて実行できることを意図した記法(環境差により追加設定が必要な場合あり)。
  • 文脈依存スニペット:構文自体は実ツールに沿うが、前提となる宣言・モデル・ハーネス・対話コンテキストを別途必要とする断片。
  • 擬似記法:説明用に数学記法・省略表記・出力例等を含む記法(ツール入力としての厳密性を保証しない)。

注意:

  • ツール準拠(そのまま動く)のコードフェンス内には、ツール入力として有効な文字列のみを記載する(出力例・図示・自然言語説明は入れない)。
  • 変数宣言・MODULE main・検証ハーネス・対話コンテキストなど、周辺の必須要素を別の場所に置く場合は 文脈依存スニペット を使う。
  • 周辺の必須要素を本文や参照先で明示している断片は 文脈依存スニペット、参照先を明示していない断片や数学記法・省略・自然言語を含む断片は 擬似記法 として扱う。
  • 図示/出力例/擬似コードは 擬似記法 を使用する。

C.3.1 概念の対応(最小セット)

概念 Z記法(本書) Alloy(Alloy Analyzer 6想定) CSP(本書/ツール) TLA+(TLC 想定)
集合(型) A : ℙ X A: set X 事象集合 {a, b} / 同期集合 X A ∈ SUBSET X
要素所属 x ∈ A x in A (事象)a ∈ X x ∈ A
関係 R : X ↔ Y R: X -> Y (通常は直接は書かない) R ⊆ X × Y
全関数 f : X → Y f: X -> one Y (通常は直接は書かない) f ∈ [X -> Y]
部分関数 f : X ⇸ Y f: X -> lone Y (通常は直接は書かない) (必要なら部分関数として表現)
状態 状態スキーマ Alloy 6 では var sig / var field、旧スタイルでは時刻(ステップ)を明示 プロセス(状態は遷移に埋め込む) 変数 v と次状態 v'
初期状態 InitState fact init { ... } または pred Init[...] 初期プロセス P0 Init == ...
遷移/操作 ΔState Trash' = Trash + f のようにprimeで次状態を参照 前置 a → P(ツールでは a -> P) Next == ...
不変条件(安全性) スキーマ制約 fact / assert refinement / assertions(ツール依存) Invariant == ... / []P
活性/公平性 (拡張が必要) (トレース上で表現) (ツール依存) <>P, P ~> Q, WF_vars(A), SF_vars(A)

注記:

  • Zの ↔/→/⇸/↦ は第5章の記号体系に合わせています。
  • CSPは本文では数学記法として →, □, ⊓ を用い、ツール(FDR/CSPM)では代表的に ->, [], |~| を用います。

C.3.2 Z記法:主要記号(読みの目安)

記号 意味 読み(例)
ℙ X 冪集合 power set of X
x ∈ A 要素所属 x is in A
R : X ↔ Y 関係 relation from X to Y
f : X → Y 全関数 (total) function from X to Y
f : X ⇸ Y 部分関数 partial function from X to Y
x ↦ y maplet(ペア) x maps to y
dom R, ran R 定義域/値域 domain/range

C.3.3 Alloy:主要記号(Alloy Analyzer 6)

記号 意味 例
sig / フィールド 集合と関係 sig User { files: set File }
多重度 one/lone/some/set 要素数制約 owner: one User
fact 常に成り立つ制約 fact { ... }
assert + check 性質検証(反例探索) check Inv for 5
run 充足例探索 run { ... } for 5
. / ~ / ^ 結合/転置/推移閉包 u.files, ~r, ^parent
var 状態により変化するシグネチャ/フィールド var sig Trash in File {}
'(prime) 次状態の値 Trash' = Trash + f
always / eventually 常に / いつか always Inv, eventually some Done
once 過去に一度でも成立 restore[f] implies once delete[f]
after / until 次状態 / ある条件まで継続 after P, P until Q
for ... steps トレース長の探索範囲 check Inv for 3 but 6 steps

補足:Alloy 6 の時相演算子はトレース上で評価されます。 Visualizer や CLI の結果を読むときは、得られた lasso trace、シグネチャのスコープ、steps の範囲を合わせて記録してください。

C.3.4 CSP:主要記号(本文/ツール)

概念 本書表記(数学記法) ツール表記(CSPM/FDRの代表例)
前置(prefix) a → P a -> P
外部選択 P □ Q P [] Q
内部選択 P ⊓ Q P |~| Q
同期並行(同期集合X) P [| X |] Q P [| X |] Q
インタリーブ P ||| Q P ||| Q
隠蔽(hiding) P \ X P \\ X
リネーム P[[ a ← b ]] P[[ a <- b ]]

注記:ツール表記は代表例です。プロジェクトでは使用ツール(FDR版、CSP dialect)に合わせて確認してください。

C.3.5 TLA+:主要記号(TLC)

記号 意味 例
v' action 内で参照する次状態の値(LTL の X / ○ とは別) x' = x + 1
[]P / <>P 常に / いつか []Inv, <>Goal
P ~> Q P が成り立つたびに、その後いつか Q が成り立つ request ~> response
WF_vars(A) / SF_vars(A) action A に対する弱 / 強公平性仮定 WF_vars(Receive)
.cfg TLC 設定 初期状態/不変条件/探索制約

WF_vars(A) / SF_vars(A) は vars と Next の subaction である action A の宣言、および Init /\ [][Next]_vars を含む仕様の文脈を必要とするため、単独では「そのまま動く」例ではありません。refinement の説明用含意も、refinement mapping と隠蔽を具体化するまでは擬似記法です。

補足:

  • Alloy は有限範囲の反例探索が中心。状態遷移を扱う場合は、時間(ステップ)を明示してモデル化する
  • TLA+ は状態遷移と時相論理が中心。action のプライムで現在状態と次状態を関係づけ、[] / <> / ~> と公平性で振る舞いの性質を記述する
  • Zは状態/操作(スキーマ)で要件を厳密化し、実装へ詳細化する

C.3.6 Quint:TLA+ 概念との最小対応

Quint は TLA+ の意味論に基づく型付き仕様言語であり、構文はよりプログラミング言語に近い。 本表は章間の読み替えのための概念対応であり、実ツールで使う場合は公式ドキュメントとバージョンを確認する。

概念 TLA+ Quint(代表例) 証跡として残すこと
モジュール ---- MODULE M ---- module M { ... } ファイル名、module名、CLI版
型/定数 CONSTANT N const N: int 型注釈、override値
状態変数 VARIABLE x var x: int 初期値、状態変数一覧
初期化 Init == x = 0 val init = x == 0 init predicate名、unprimed変数であること
次状態関係 Next == x' = x + 1 action step = x' = x + 1 next/action名、trace出力
不変条件 Inv == x >= 0 val inv = x >= 0 invariant名、探索長
時相性質 []P, <>P always(P), eventually(P) backend、境界、fairness仮定
有効性 ENABLED A enabled(A) actionの前提、deadlock扱い

C.3.7 Lean / Rocq:定理証明の概念対応

Lean と Rocq はどちらも、定理文と証明を機械的に検査する証明支援系である。 LLM が生成した証明スクリプトや補題は、最終的に各証明器のカーネル/型検査器で受理されたものだけを成果物として扱う。

概念 Lean 4 Rocq(旧称 Coq) 注意点
定理/補題 theorem / lemma Theorem / Lemma 名称よりも前提と結論の対応をレビューする
証明本体 tactic script / term tactic script / term tactic成功は要求妥当性の証明ではない
未完了穴 sorry / admit Admitted. 等 CI で検出し、例外なら期限と理由を残す
公理・仮定 axiom, assume相当 Axiom, Parameter 等 trust boundaryを広げるため棚卸しする
依存ライブラリ mathlib / Lake opam package等 lockfile、ライブラリrevision、toolchainを記録する

C.3.8 Rust検証ツール:契約・ハーネス・ghostの対応

Rust検証では、Rustコンパイラの所有権・借用検査だけでなく、追加の仕様・証明義務・模型検査を使う。 ツールごとに構文とサポート範囲が異なるため、下表は概念対応として使う。

概念 Kani Verus Creusot / Prusti / Aeneas 証跡として残すこと
検証入口 proof harness 仕様付き関数/証明関数 契約付き関数、変換対象関数 対象関数、対象コミット
事前条件 harness内の入力制約、contract requires requires / precondition 入力範囲、除外ケース
事後条件 assert!、contract ensures ensures / postcondition 仕様レビュー結果
不変条件 ループ/状態のassertion invariant / proof loop invariant 未証明部分、timeout
ghost code 通常はモデル/補助値で代替 ghost/spec/proof code ghost / Pearlite / 変換先証明 実行コードとの分離
未検証仮定 assume、unwind不足 assume、未証明補題 trusted/assume/外部仕様 例外台帳、影響範囲
結果 成功/反例/リソース切れ VC成功/失敗 VC成功/失敗/反例 solver版、境界、ログ

C.3.9 LTL / CTLと確率propertyの概念対応

通常のLTL / CTLは、対象pathまたは計算木で性質が成り立つかを主に真偽で表す。 PRISMのPCTL / CSL系propertyは、同じ到達・継続・長期挙動へ確率、閾値、期待rewardを加える。 下表は読み替えの入口であり、論理間の同値変換表ではない。

問いたいこと 通常のLTL / CTLでの見方 PRISMの定量的な見方 追加で固定すること
成功へ到達するか LTL F success、CTL EF success / AF success P=? [ F "success" ] 初期状態、確率分布、対象scheduler
到達確率が基準を満たすか 真偽だけでは確率massを表さない P>=0.99 [ F "success" ] thresholdの根拠、丸め・許容差
長期に正常である割合 単純なG / AGは「常に」であり時間割合ではない S=? [ "operational" ] 定常性、初期分布、吸収class
完了までのcost trace上のevent数を別途集計 R{"cost"}=? [ F "done" ] rewardの単位、付与位置、未到達path
環境選択を含む境界 fairness等を仮定してpathを制約 MDPのPmin / Pmax、Rmin / Rmax scheduler / adversary class
不成立時の説明 反例trace 確率値、scheduler、代表path、critical subsystem 生成方法と網羅範囲

特にP>=1 [ F "success" ]を機械的にAF successと同一視してはいけない。 DTMC、CTMC、MDPではpath measureとnondeterminismの意味が異なり、確率1でもmeasure 0のpathをどう扱うかという境界が残る。 論理式を比較するときは、模型種別、初期状態、scheduler、公平性、時間境界を先にそろえる。

C.3.10 Tamarin:セキュリティプロトコル検証の最小対応

Tamarinは通常の状態変数中心の記法ではなく、protocol状態と攻撃者知識をmultiset rewritingで表す。 次の表は第13章の例を読むための対応であり、全記法の一覧ではない。

Tamarin概念 本書での読み方 第13章例 証跡として残すこと
fact protocol状態、鍵、message、攻撃者知識 !SharedKey、OpenChallenge、In / Out persistent / linear、引数、生成rule
rule factを消費・生成するprotocol step challenge発行、応答送信、受理 前提、結果、action fact
action fact / event lemmaがtrace上で参照する観測点 ResponseSent、ResponseAccepted 主体、session data、順序
lemma executability、秘密性、認証等のtrace property Shared_Key_Secrecy、Response_Authentication、No_Replay quantifier、仮定、proof mode、status
attack trace falsified lemmaを破る具体的実行 同じ暗号文の二重受理 対象lemma、step、攻撃者のmessage操作
equational theory 暗号演算をsymbolicに簡約する等式 sdec(senc(m,k),k)=m built-in、未モデル化演算、代数的仮定

Response_Authenticationのようなnon-injective correspondenceと、一つの送信へ一つの受理だけを対応させるinjective propertyは区別する。 symbolicなverifiedを、暗号実装や計算量的安全性の無条件な証明へ読み替えてはいけない。

C.3.11 SymbiYosys:同期RTL formalの最小対応

SymbiYosysは、RTLとpropertyをYosysで形式模型へ変換し、指定したengineとsolverでBMC、証明、到達性探索を実行するfront endである。 次の表は第8章のarbiter例を読むための対応であり、SystemVerilog Assertions全体の構文表ではない。

RTL/formal概念 第8章例での表現 検査上の意味 証跡として残すこと
clock edge always_ff @(posedge clk) register遷移の1 step clock、mode、depth
reset contract 最初のedgeだけrstをassume 意図した初期化系列へ環境を制限 reset極性、assert期間、仮定
safety property assert(!(grant0 && grant1)) 両grant同時assertの禁止 property位置、PASS / FAIL
environment constraint assume(...) solverが列挙するinput traceを制限 全assumptionと根拠
reachability target cover(...) 関心状態へ至る実行を一つ探す 到達step、witness VCD
BMC mode bmc, depth 6 深さ6以内のassertion違反探索 bound、counterexample VCD
k-induction mode prove, depth 6 base caseとtemporal induction 両phaseのstatus、engine
sampled prior value $past(req0) 前clock edgeのrequest 初回sampleのguard

assertがPASSしても、強すぎるassumeが欠陥traceを除外していれば主張は空虚になり得る。 同時requestのような重要環境条件をcoverで到達確認し、到達不能なcoverを安全性成功と同一視しない。

C.3.12 RTLola:runtime verificationの最小対応

runtime verificationは、設計modelの全behavior探索ではなく、instrumentationから得たevent traceをpropertyへ照合する。 次の表は第11章のauthentication例を読むための対応であり、RTLola言語やstream処理全体の構文表ではない。

runtime verification概念 第11章例での表現 検査上の意味 証跡として残すこと
input event field auth_success、sensitive_operation、time CSV rowからmonitorへ渡す観測値 schema、単位、型、欠落方針
derived state / output stream authenticated 過去の認証成功を保持するmonitor状態 初期値、更新式、session境界
previous value offset(by: -1).defaults(to: false) 直前eventのmonitor状態と初期値 offset意味論、trace始端
trigger 未認証時の機密操作 safety property違反のverdict 時刻、message、property ID
finite trace 3 rowの相対時刻CSV 観測された有限prefixだけを検査 最初/最後の時刻、row数、入力hash
online / offline 本例は--offline relative-float-secs 保存traceを決定的に再実行 mode、clock、ordering、tool version
no violation 正常traceの0件 対象prefixで違反を検出しなかった 未観測runを保証しない旨
expected violation 違反traceの1件 monitorが既知の違反を検出した 独立導出した期待結果との照合

LTLの無限trace上のGやFを有限logへそのまま移すのではなく、終端時のtrue / false / inconclusive、期限、欠測の扱いを定める。 eventが収集されなければmonitorはその事実を自動的に知れないため、observabilityとmonitorabilityをpropertyそのものから分離して評価する。