抽象によるソフトウェア設計 付録A 練習問題 その11
付録A 練習問題続きます。今日は雨で時間がなかったので1つだけ。
- A.2.1 (c) 通話転送機能をくみこむ
- 転送先が接続元だったら?と思いましたが、相互の接続は禁止していないのでそのままにしました。うーん、こういう細かいところ悩みますね。
module exercises/phones sig Phone { requests: set Phone, connects: lone Phone, forward: lone Phone } // 接続要求と接続は1つ以上ある pred SomeRequestsExist { #requests > 0 } pred SomeConnectionsExist { #connects > 0 } // 自分自身に接続しない pred AvoidSelfConnection { no p: Phone | p -> p in requests no p: Phone | p -> p in connects no p: Phone | p -> p in forward } // (b)-1 すべての接続には対応する要求がある fact { all p1, p2: Phone | p1 -> p2 in connects => p1 -> p2 in requests } // 会議通話(複数の接続をもつ通話)は forward を除いて存在しない fact { all p: Phone | #(p.connects - p.forward) + #connects.p < 2 } // forward をもつ電話に電話がかかったら転送する fact { all p: Phone | none = connects.p or // p に電話がかかってないか none = p.forward or // 転送先が設定されていなければ p -> p.forward in connects // 転送先にも接続する } run { SomeRequestsExist SomeConnectionsExist AvoidSelfConnection }