Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Alloyで川渡問題を解く

  • Identifiez-vous pour voir les commentaires

Alloyで川渡問題を解く

  1. 1. Alloy~川渡り問題~ @ichigo_o_re
  2. 2. 川渡り問題• 川岸にいる一団を対岸に渡す。• 川を渡る手段は小船だけであり、小さいので数人しか乗 れない。• 特定の組み合わせがどちらかの岸にできてはいけない。• とかいうものっ• 今回は3つを解いてみました。
  3. 3. 川渡り問題①
  4. 4. 大人と子供• 1人の大人と2人の子供が岸にいる。ボートが1台あるが 大人1人か子供2人までしか乗れない。全員が川を渡るに はどうすればよいか? 船 大人 子供 (※画像はイメージです。)
  5. 5. 制約としてまとめる
  6. 6. 大人と子供• 1人の大人と2人の子供が岸にいる。ボートが1台あるが 大人1人か子供2人までしか乗れない。全員が川を渡るに はどうすればよいか?
  7. 7. 制約としてまとめる• 大人1人
  8. 8. 大人と子供• 1人の大人と2人の子供が岸にいる。ボートが1台あるが 大人1人か子供2人までしか乗れない。全員が川を渡るに はどうすればよいか?
  9. 9. 制約としてまとめる• 大人1人• 子供2人
  10. 10. 大人と子供• 1人の大人と2人の子供が岸にいる。ボートが1台あるが 大人1人か子供2人までしか乗れない。全員が川を渡るに はどうすればよいか?
  11. 11. 制約としてまとめる• 大人1人• 子供2人• すべての人間が最初は左側の岸にいる
  12. 12. 大人と子供• 1人の大人と2人の子供が岸にいる。ボートが1台あるが 大人1人か子供2人までしか乗れない。全員が川を渡るに はどうすればよいか?
  13. 13. 制約としてまとめる• 大人1人• 子供2人• すべての人間が最初は左側の岸にいる• ボートは1台
  14. 14. 大人と子供• 1人の大人と2人の子供が岸にいる。ボートが1台あるが 大人1人か子供2人までしか乗れない。全員が川を渡るに はどうすればよいか?
  15. 15. 制約としてまとめる• 大人1人• 子供2人• すべての人間が最初は左側の岸にいる• ボートは1台• ボートに乗れるのは o 子供2人 o 子供1人 o 大人1人
  16. 16. 大人と子供• 1人の大人と2人の子供が岸にいる。ボートが1台あるが 大人1人か子供2人までしか乗れない。全員が川を渡るに はどうすればよいか?
  17. 17. 制約としてまとめる• 大人1人• 子供2人• すべての人間が最初は左側の岸にいる• ボートは1台• ボートに乗れるのは o 子供2人 o 子供1人 o 大人1人• 全員が右側の岸につくと完成
  18. 18. Alloy• ①それぞれの人間、島、船を宣言するenum 岸{左,右} //岸を継承した左、右abstract sig 物体{} //抽象的な物体one sig 船 extends 物体{} //物体を継承した船abstract sig 人 extends 物体{} //物体を継承した人one sig 大人 extends 人{} //人を継承した大人sig 子供 extends 人{} //人を継承した子供fact { #子供 = 2 } //子供は2人であるsig State {l: 物体 -> one 岸} //物体がどの岸にいるか
  19. 19. Alloy• 一番最初には全ての物体は左にあるpred init(s: State){s.l = 物体 -> 左}//sという状態において、物体は左側にある
  20. 20. Alloy• 動き方を指定するpred move(s, s: State, b: 船){ (one p: 人 | (p.(s.l) = b.(s.l)) and s‘.l = s.l - b -> b.(s.l) - p -> p.(s.l) + b -> (岸 - b.(s.l)) + p -> (岸 - p.(s.l))) or (some p, p: 人 | (p.(s.l) + p.(s.l)) = b.(s.l) and (p + p) in 子供 and s.l = s.l - b -> b.(s.l) - p -> p.(s.l) - p -> p.(s.l) + b -> (岸 - b.(s.l)) + p -> (岸 - p.(s.l)) + p -> (岸 - p.(s.l)))}
  21. 21. Alloy• 動き方を指定するpred move(s, s: State, b: 船){ (one p: 人 | (p.(s.l) = b.(s.l)) and s‘.l = s.l - b -> b.(s.l) - p -> p.(s.l) + b -> (岸 - b.(s.l)) + p -> (岸 - p.(s.l))) or (some p, p: 人 | (p.(s.l) + p.(s.l)) = b.(s.l) and (p + p) in 子供 and s.l = s.l - b -> b.(s.l) - p -> p.(s.l) - p -> p.(s.l) + b -> (岸 - b.(s.l)) + p -> (岸 - p.(s.l)) + p -> (岸 - p.(s.l)))}ある一人の人(大人or子供)に対してその人のいる岸と船のある岸が同じだったら新しい関係(s’.l)は今までの関係(s.l)から動かす人と岸、船と岸をなくして、新しい岸との関係を足したものとしています
  22. 22. • 新しい関係は今までの関係から動かす人と岸、船と岸を なくして、新しい岸との関係を足したものとしています• (大人と船を動かす場合)
  23. 23. Alloy• 動き方を指定するpred move(s, s: State, b: 船){ (one p: 人 | (p.(s.l) = b.(s.l)) and s‘.l = s.l - b -> b.(s.l) - p -> p.(s.l) + b -> (岸 - b.(s.l)) + p -> (岸 - p.(s.l))) or (some p, p: 人 | (p.(s.l) + p.(s.l)) = b.(s.l) and (p + p) in 子供 and s.l = s.l - b -> b.(s.l) - p -> p.(s.l) - p -> p.(s.l) + b -> (岸 - b.(s.l)) + p -> (岸 - p.(s.l)) + p -> (岸 - p.(s.l)))}ある二人の人(大人or子供)に対してその人たちのいる岸と船のある岸が同じで、二人とも子供だったらs’.lは今までの関係から動かす人と岸、船と岸をなくして、新しい岸との関係を足したものとしています
  24. 24. ぐるぐるぽ~ん! (実際にやる)
  25. 25. 川渡り問題②
  26. 26. 宣教師と先住民川のこちら側に3人の宣教師と3人の先住民がいます。こちらの川岸に2人乗りのボートが1台あり、これを使って6人全員を対岸に移したいのですが、一時的に も宣教師の数が先住民の数より少なくなると先住民は宣教師を食べてしまいます。無事に全員を対岸まで渡らせる手順を考えて下さい。 宣教師 先住民 船 (※画像はイメージです。)
  27. 27. 制約としてまとめる• 宣教師が3人• 先住民が3人• 2人乗りのボートが1台• 先住民の数が宣教師の数を上回ってはいけない。• 無事に全員を対岸まで渡らせる
  28. 28. 制約としてまとめる• 宣教師が3人• 先住民が3人• 2人乗りのボートが1台• 先住民の数が宣教師の数を上回ってはいけない。• 無事に全員を対岸まで渡らせるここが変わっただけ!
  29. 29. Alloyでぐるぐるぽ~ん
  30. 30. 川渡り問題③
  31. 31. 危険な家族 船 (※画像はイメージです。)• ある家族がいます。 この家族は舟を使って川の向こう岸へわたろうとしています。 舟は1台しかなく、1度に2人まで乗ることができます。 家族は父、母、息子2人、娘2人、犬、メイドの8人(犬も1人と数えます) でありまたこの舟をこげるのは父か母かメイドの3人だけです。• さぁ、そしてこの家族、ぢつは!とっても危険な家族なんです。 メイド まず父は、母がいないと娘を殺してしまいます。 また母は、父がいないと息子を殺してしまいます。 そしてきわめつけ。 犬は、メイドがいないと家族をみんな殺してしまいます。• 誰も死ぬことなく川をわたりきるにはどうすればよいでしょうか?父母 娘2人,息子2人 犬
  32. 32. 制約としてまとめる• 母1人• 父1人• 息子2人• 娘2人• メイド1人• ボート1台• 犬1人• 犬はメイドがいないと、同じ岸の人間を食べる• 父は母がいないと同じ岸の娘を殺す• 母は父がいないと同じ岸の息子を殺す• ボートをこげるのは、メイドと父と母だけ!
  33. 33. 制約としてまとめる• 母1人• 父1人• 息子2人• 娘2人• メイド1人• ボート1台• 犬1人• 犬はメイドがいないと、同じ岸の人間を食べる• 父は母がいないと同じ岸の娘を殺す• 母は父がいないと同じ岸の息子を殺す• ボートをこげるのは、メイドと父と母だけ!
  34. 34. Alloyでぐるぐるぽ~ん
  35. 35. Alloyを高速化!• 検索のスコープをしぼる (run xx for xx but xx, xx) run show for 6 → run show for 6 but 4 Object• 一つだけの要素はone sigで宣言する (one sig 大人)• これらを行えばより速く探し出せます。
  36. 36. • そのまま 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.
  37. 37. まとめ• 川渡り問題を解くことでAlloyが実際に”制約”を書くだけで それを満たす解を探しだしてくれることがわかりました。• “制約”は他の論理パズルやソフトウェア等にも出てくるの でAlloyを使えば自分の設計したものの制約が正しいかを チェックすることができます!!

×