抽象によるソフトウェア設計 付録A 練習問題 その9
付録A 練習問題続きます。ようやく A.1 は終わりそうです。
- (f), (g), (h) はまとめて。(g) の「順番のヒント」という表現や (h) の「対称的な解が数多くある」というところから、解答はこういう書き方じゃないと思います(これだとインスタンスは1つだけ)。直接的な表現もいい練習になったのでこのままで。
module exercises/tube abstract sig Station { jubilee, central, circle: set Station } sig Jubilee, Central, Circle in Station {} one sig Stanmore, BakerStreet, BondStreet, Westminster, Waterloo, WestRuislip, EalingBroadway, NorthActon, NottingHillGate, LiverpoolStreet, Epping extends Station {} run { Jubilee = Stanmore + BakerStreet + BondStreet + Westminster + Waterloo Central = WestRuislip + EalingBroadway + NorthActon + NottingHillGate + BondStreet + LiverpoolStreet + Epping Circle = BakerStreet + NottingHillGate + Westminster + LiverpoolStreet -- jubilee jubilee = Stanmore -> BakerStreet + BakerStreet -> BondStreet + BondStreet -> Westminster + Westminster -> Waterloo -- central central = WestRuislip -> NorthActon + EalingBroadway -> NorthActon + NorthActon -> NottingHillGate + NottingHillGate -> BondStreet + BondStreet -> LiverpoolStreet + LiverpoolStreet -> Epping -- circle circle = BakerStreet -> NottingHillGate + NottingHillGate -> Westminster + Westminster -> LiverpoolStreet + LiverpoolStreet -> BakerStreet }
- (i) [難解] と付けられているように問題文が難しいですが、何度か読んで、要するに途中に分岐などがある時にどちらにいっても到達できるかどうかの差だと考えて以下のように記述してみました
sig Station { line: set Station } fact { no s: Station | s -> s in line } -- 路線 line に from から to に到達する経路がある pred CanReach (from, to: Station) { from = to or to in from.^line } -- 路線 line でどの経路を選んでも from から to に必ず到達する pred MustReach (from, to: Station) { no mid: Station | mid in from.^line and not mid in to.^line and not CanReach [mid, to] } run { some from, to: Station | CanReach [from, to] and not MustReach [from, to] }
これで A.1 は終わりました。付録 A はまだまだ続きます。