17. 制約としてまとめる
• 大人1人
• 子供2人
• すべての人間が最初は左側の岸にいる
• ボートは1台
• ボートに乗れるのは
o 子供2人
o 子供1人
o 大人1人
• 全員が右側の岸につくと完成
18. Alloy
• ①それぞれの人間、島、船を宣言する
enum 岸{左,右} //岸を継承した左、右
abstract sig 物体{} //抽象的な物体
one sig 船 extends 物体{} //物体を継承した船
abstract sig 人 extends 物体{} //物体を継承した人
one sig 大人 extends 人{} //人を継承した大人
sig 子供 extends 人{} //人を継承した子供
fact { #子供 = 2 } //子供は2人である
sig State {l: 物体 -> one 岸} //物体がどの岸にいるか
36. Alloyを高速化!
• 検索のスコープをしぼる
(run xx for xx but xx, xx)
run show for 6 → run show for 6 but 4 Object
• 一つだけの要素はone sigで宣言する
(one sig 大人)
• これらを行えばより速く探し出せます。
37. • そのまま
o Executing "Run show for 18"
o Solver=sat4j Bitwidth=0 MaxSeq=0 SkolemDepth=1 Symmetry=20
o 569162 vars. 774 primary vars. 2891145 clauses. 29311ms.
o . found. Predicate is consistent. 84805ms.
• スコープを絞る
o Executing "Run show for 12 but 18 State"
o Solver=sat4j Bitwidth=0 MaxSeq=0 SkolemDepth=1 Symmetry=20
o 176946 vars. 516 primary vars. 761597 clauses. 6240ms.
o . found. Predicate is consistent. 22715ms.
• 個数が1のものはonesigで宣言する
o Executing "Run show for 12 but 18 State"
o Solver=sat4j Bitwidth=0 MaxSeq=0 SkolemDepth=1 Symmetry=20
o 21371 vars. 446 primary vars. 49658 clauses. 524ms.
o . found. Predicate is consistent. 1415ms.