17. モデルの修正
sig Company, Person {} // 企業と従業員
one sig Employ {
employee : Company lone -> set Person// 雇用関係
}
一人の人が複数の企業に雇われないように。従業員は0人以上。
18. 1対nの関係のバリエーション
sig Company, Person {} // 企業と従業員
one sig Employ { // 雇用関係
employee : Company lone -> set Person
}
lone(0か1)
one(1のみ)
set(0以上)
some(1以上)
31. Alloyによるモデル化
? 木構造のファイルシステムと4つの操作(新規作
成、コピー、削除、権限変更)をモデル化。
? 各操作を実行する前に権限をチェック。
abstract sig Elem {
// 全てのファイルシステムエレメントには権限が設定されている。
permission : Permission
}
sig File extends Elem {
contents : Contents // ファイルには内容がある。
}
sig Dir extends Elem {} // ディレクトリ。子要素は別途定義する。
32. Alloyによるモデル化
操作定義と権限チェックの実施
//オペレーション定義
abstract sig Operation {}
sig Create extends Operation { target : Path } //新規作成
sig Copy extends Operation { disj src, dst : Path } //コピー
sig Delete extends Operation { target : Path } //削除
sig Chmod extends Operation { target : Path, perm : Permission } //権限変更
//抜粋
else #(Chmod & x.command) > 0 => {
let c = (x.command <: Chmod), s = x.state {
exists[s, c.target]
getElem[s, c.target].chmodable //変更権限があるか?
}
}
33. 検証したい性質の記述
権限変更フラグが立っていないファイルをどう操作しても、
pred PermissionConsistency {
some x : StateTrans | some y : x.^next | some p : sameFiles[x.state, y.state] |
let xe = getElem[x.state, p], ye = getElem[y.state, p] |
xe.contents = ye.contents and
xe.permission.perm = none and // 権限変更できないはずなのに
ye.permission.perm = P // できたりしないよね?
}
権限変更フラグを立てた状態にはできない。
(フラグを立てた状態に至るパスを見つけろ)