2.4. モデリング・セッション2: 仕様を拡張する

2.4. モデリング・セッション2: 仕様を拡張する

先ほど取り上げた仕様は、ごく簡単に、最低限の機能を記述したものでした。以下では、この仕様を拡張してみましょう。

以下の仕様追加を行ないます。

  • ロール同士に、階層関係を持たせる(経理課職員と人事課職員は総務部職員をスーパー・ロールに持つなど)
  • ユーザーにロールを追加・削除する機能を追加する
  • ロールに権限を追加・削除する機能を追加する
  • ロールを追加して削除した際にユーザーのロールが最初の状態に戻ることを検証する

2.4.1. ロールの階層関係

ロール(Role)の階層関係を表現するためには、以下のように記述します。

Alloy Analyzerには、汎化関係の記述もあります。しかし、今回のようなケースでは、汎化は使いません。

ただし、これだけではロールの階層構造がループしてしまます。例えば「経理課職員のスーパー・ロールが経理課職員」という状況が発生してしまいます。これを防ぐため、以下の記述を追加します。

  • r:RoleはRoleのアトムrを表します
  • e in Aと書いた場合、「eはAの要素である」ことを表します
  • no x:A | V(x)と書いた場合、通常の論理式では¬(∃ x:A.V(x))、つまりVを満たすAの要素はないことを表わします
  • ^は推移閉包(Transitive Closure)を表します。r.^superRolesは、rからsuperRolesをたどっていってたどり着ける、すべてのRoleの要素の集合を表します

上記の記述は、ロールrからsuperRolesをたどっていった時、その中にr自身が含まれることはない、という不変制約を表しています。

2.4.2. 追加・削除機能

ユーザーへのロールの追加・削除、およびロールへの権限の追加・削除は、以下のように記述します。

predはPredicate、つまり述語を表しています。結果が真偽で表現される点が、述語の特徴です。機能を記述する際には、集合を返すものはfunで、真偽を返すものはpredを使って記述することになります。

上記の例では、rを事前条件としてのRole、r'を事後条件としてのRole、として考えます。addRoleでのu'.roles=u.roles+rは、「事後条件として、u'の持つrolesは、事前条件uの持つrolesにrを加えた集合」と読めます。

2.4.3. 追加・削除機能の検証

ロールを追加して削除した場合、操作前と操作後で同じロール構成になっていなければなりません。これを表すには、以下のように記述します。

assertは表明です。この表明は真である、と仮定されます。checkコマンドによって、反例を探索します。

  • all: 「すべての」を表す量化子。|の前に指定した変数すべてにおいて、|以下の述語が成り立つことを表します
  • disj: u,u',u''が同一アトムを示さないことを表します。Alloy Analyzerでは、この指定を行わなかった場合、uとu'が同じアトムの場合も含まれることになります
  • implies: 含意。「ならば」を表します

上記の例は、

ということを表します。

このようにして、仕様が正しいかどうかを確認していくことになります。

ここまでの完全な仕様は、以下の通りです。

3. 最後に

3.1. 本記事のまとめ

本記事では、Alloy Analyzerを用いたアジャイル・モデリングを通して、形式手法によるモデリングの概観を解説しました。

成果物の精度を上げたい、品質を上げたい、と真剣にお考えの方に、少しでも参考になれば幸いです。

筆者は現在、Formal Methods Forumというサークルを運営しています。ご興味がありましたら、ぜひご参加ください。

3.2. 参考文献

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30