いいかげんな要求仕様を自動的にチェックする.
CSVとか,RDBとか,XMLとかいろんなデータの寄せ集めにおいて,データの整合性をチェックする仕組みを模索していたら,「いいかげんなデータの整合性をチェックする」手法ではなくて「いいかげんな要求仕様の整合性をチェックする」手法がひっかかった.
Handling non-canonical software requirements based on Annotated Predicate Calculus
Knowledge and Information Systems
http://www.springerlink.com/content/5351217j00qh3183/?p=6e574e8eb36d455db44d1c6ad3a1bc5c&pi=3
Annotated Predicate Calculus
なんか,普通の論理式P の後ろに :t とか :f とか :T , :⊥ , :fp , :tp などをつけて
- P:t Pは必ず真
- P:f Pは必ず偽
- P:T Pは矛盾する
- P:⊥ Pかどうかわからん
- P:tp Pは真になることがある
- P:fp Pは偽になることがある
というアノテーションをつける論理計算らしい
例:
図書館システムの例
- ほとんどの場合,本が予約されていたら,予約した人がその本を借りることになる
- Reserve(User,Book):t => Borrow(User,Book):tp
- 今のところ,利用者が延滞している場合に通知するかについては規定がない
- Borrow(User,Book):t ^ Overdue(Book):t => Notify(User,Book):⊥
「わからん」というのを論理体系にもってくるのは面白いけど,役に立つのかな?
要求仕様とシナリオとテストケース
Annotated Predicate Calculus を評価実験するための枠組み
- 要求仕様
- シナリオ(="入力"と"期待する出力":テストケース?)
が与えられた時に,要求仕様を「必要」「有用」「不要」に分類する.
サンプルシナリオ
これを使ってこんな要求仕様とシナリオを作ったらしい.
住宅の駐車場に車が入ってよいかどうかを判断するシステム
要求仕様:
1) 管理人が特別に許可した車は入ってよい
2) 管理人は業務用車輌は許可する
3) 普通,許可された車にはシステムによって自動的にガレージが割り当てられる
4) 普通,業務用車輌にはガレージが必要である1) Authorized(V):t => Enter(V):t
2) Logistics(V):t => Authorized(V):t
3) Authrized(V):t => Garage(V):tp
4) Logistics(V):t => Garage(V):tp
シナリオ:
input: Logistics(ダンプカー):t
expected output: Garage(ダンプカー):tp
この場合, 1) は「不要」 4) は「有用」だが「必要」ではない(2と3があれば導けるから)
「だから,1と4は要求仕様から消してよい」....て書いてあるんだけど,車が入ってよいかどうか判断できなくなるけどいいのか?
他にも,車を割り当てたガレージに対して,
9)壊れたガレージは修理する必要がある
10)普通,耐用期限が過ぎたガレージは修理する必要がある9) Distributed(G):t ^ Damaged(G):t -> Maintain(G):t
10) Distributed(G):t ^ Expired(G):t -> Maintain(G):tp
※ Distributed(G) : Gは車が割り当てられているガレージである
という要求仕様を追加して
「この要求仕様の欠点を洗い出すために,こういうテストケースを考えました」
input: not Distributed(G3) :t ^ Damaged(G3) :t
output: Maintain(G3): t
「でも,これだけからは Maintain(G3): ⊥ (G3は修理していいかどうか不明)
となって,テストに失敗します」
「ほら,こうやってシステム開発者にガレージの種類(Distributed(G)かどうか?)
をチェックさせることを思い出させるでしょ」
で評価の章がおわっている
....うーん,なんかさっぱり有用性がわからん.