付録F:AI支援で形式仕様/検証を回す実践ガイド
この付録は、AI支援で仕様作成・検証を回すための実践テンプレートをまとめたものです。AIの出力は「提案」として扱い、最終判定は検証器(TLC/Alloy/Rocq(旧称:Coq)/Dafny等)に寄せる前提で運用してください。
F.1 AI時代の前提
- 生成は速いが、誤りも速い。
- 仕様・不変条件・証明スケッチの生成はAIが得意。
- 合否判定は検証器とCIで行う。
F.2 信頼境界(Trust Boundary)
- LLM/エージェント: 提案者(untrusted)
- 検証器(TLC/Alloy/Rocq(旧称:Coq)/Dafny): 判定者(trusted)
- CI: 執行者(再現性の担保)
この境界を崩すと、AIの誤りが品質保証の誤りに直結します。
F.3 ワークフロー(テンプレ)
- 要求(目的/禁止事項)を短文で明確化
- 用語定義(名詞の境界・同義語)を整理
- 不変条件(常に成り立つ性質)を列挙
- モデル化(小スコープ/浅い探索)
- 反例の確認 → 原因分析
- 修正 → 再検証(再現性確保)
CIでは「PR/夜間/リリース前」で深度を段階化し、検証コストを制御します。
F.4 プロンプトテンプレ(コピペ用)
1) 仕様抽出
あなたは仕様担当です。以下の要求から、用語定義、状態、イベント、不変条件、許容しない振る舞いを抽出してください。
要求: <要求テキスト>
出力形式: 用語/状態/イベント/不変/禁止事項
2) Alloy雛形生成
以下の用語定義と不変条件をAlloyのsig/fact/assertに変換してください。小スコープで検証可能な雛形にしてください。
用語: <用語定義>
不変: <不変条件>
3) TLA+雛形生成
以下の状態とイベントから、TLA+のInit/Next/Specを作成してください。必要な変数と不変条件も含めてください。
状態: <状態>
イベント: <イベント>
不変: <不変>
4) 反例トレースの要約
以下の反例トレースを要約し、原因の候補と修正案を3つ提示してください。
反例: <トレース>
5) PR向け検証チェックリスト
以下の変更に対して、必要な検証チェック項目と実行コマンドを列挙してください。
変更内容: <PR差分要約>
F.5 エージェント運用ガイド
Issue作成時
- 受け入れ条件(検証で合否判定可能な形)
- 非目標(やらないこと)
- 実行コマンド(検証器/テスト)
PRレビュー時
- 仕様差分と検証差分が一致しているか
- 検証ログ(seed/深さ/スコープ)を添付しているか
- 反例が出た場合の修正手順が残っているか
F.6 反例→修正→再検証の例(最小)
- 反例: FIFOを満たさないトレースが出力
- 原因: Dequeue操作の前提条件が弱い
- 修正: 空キュー時のDequeueを禁止する不変を追加
- 再検証: seed/深さ/スコープを固定して再実行
F.7 PRに添付すべき成果物
- 検証ログ(コマンド/seed/深さ/スコープ)
- 反例トレース(ファイル名・再現手順)
- 変更の意図(仕様差分の要約)
- 実行環境(OS/ツールバージョン)
本付録のテンプレートは、チーム内の標準運用ルールとして流用できます。
F.8 反例トリアージテンプレ(事実/仮説を分離)
反例の処理では、「ログに書かれている事実」と「原因の推測」を混ぜないことが重要です。
AIは要約や観点列挙に有用ですが、事実欄はログ/トレースから転記し、仮説欄は別枠に分離してください。
テンプレファイル(リポジトリ内):templates/counterexample-triage.md(以下にも同内容を掲載)
テンプレ(コピペ用)
## 検証対象
- 対象(仕様/実装/設定):
- 期待する性質(安全/活性/不変/契約):
- 変更差分の要約:
- 関連Issue/PR:
## 実行環境(事実)
- OS/CPU:
- 実行場所(ローカル/CI):
- ツール/バージョン:
- Alloy:
- TLC:
- Apalache:
- Dafny:
## 再現手順(事実)
- command:
- seed:
- scope/depth/length:
- time-limit:
- artifact(ログ/反例):
## 観測された事実(ログ/トレース抜粋)
- どの性質が破れたか:
- 反例の最短トレース(要約):
## 仮説(原因候補)
- H1:
- H2:
- H3:
## 修正案(候補)
- Fix案1:
- Fix案2:
## 再検証
- 再実行コマンド:
- 結果(OK/NG):
- 学び(再発防止策):
F.9 AI生成物の品質保証チェックリスト(仕様/証明/CI)
AI生成物を含む変更は、次の観点で「検証可能な成果物」へ落とし込む。
仕様(自然言語/Alloy/TLA+)
- 用語定義が明確(同義語、境界、単位、例外条件)
- 前提条件(環境仮定、公正性、障害モデル)が明示されている
- 不変条件(安全性)が列挙され、破れたときの意味が説明できる
- 活性(必要な場合)が定義され、過剰な仮定で「見かけ上成立」していない
- 数値(%/倍/件数)は出典付き、または例示であることを明記
証明/模型検査(再現性)
- 何をチェックしたか(性質名、範囲、スコープ/深さ/長さ)が明確
- 実行条件(seed、上限時間、探索上限)が記録されている
- 反例が出た場合、反例の再現手順と最小トレースが残っている
- 「直した結果」を再検証し、回帰(同系統の性質)も確認している
CI(ゲート設計)
- PR/夜間/リリース前で検証深度が段階化されている
- 失敗時にログ/反例がartifactとして保存され、再現可能
- 例外(検証スキップ)の条件と承認フローが定義されている
- ツールのバージョンが固定され、キャッシュ/再現性が担保されている