atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • このページの操作履歴
    • このウィキのページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
TLA+メモ@ウィキ
  • 広告なしオファー
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
広告非表示(β版)
ページ一覧
TLA+メモ@ウィキ
  • 広告なしオファー
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
TLA+メモ@ウィキ
広告非表示 広告非表示(β)版 ページ検索 ページ検索 メニュー メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • このページの操作履歴
    • このウィキのページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • TLA+メモ@ウィキ
  • 川渡り問題

TLA+メモ@ウィキ

川渡り問題

最終更新:2023年06月02日 23:41

tlaplus

- view
メンバー限定 登録/ログイン

川渡り問題


問題

3匹ずつの狼と小鳥を、すべて向こう岸に渡せ。
ただし、以下の条件がある。

  • いかだに乗れるのは2匹まで。
  • 1匹も乗っていないと動かない。
  • どちらの岸でも狼が小鳥の数より多くなると、小鳥が食べられて失敗する。

モデル

--------------------------- MODULE RiverCrossing ---------------------------
EXTENDS Integers, FiniteSets
 
 
 
(*--algorithm RiverCrossing {
 
\* 初期状態
variables (* LSideとRSideはそれぞれ左岸と右岸の状態を表すレコード *)
          LSide = [wolf |-> 3, bird |->3], RSide = [wolf |-> 0, bird |->0],
          (* sideは現在のボートの位置 *)
          boat = [side |-> "left", wolf |-> 0, bird |->0],
          (* OnBoatはボートに乗ることができる狼と小鳥の組み合わせを表す *)
          OnBoat = {<<1,0>>,<<0,1>>,<<1,1>>,<<2,0>>, <<0,2>>};
 
define
{
(* どちらの岸でも狼の数が小鳥の数より多くなると真となる *)
GetsEaten == /\ LSide.wolf >  LSide.bird /\ LSide.bird > 0
             /\ RSide.wolf >  RSide.bird /\ RSide.bird > 0
 
(* ボートが安全に移動できるかどうかを判断する *)
safeBoats(from, to, t) == /\ from.wolf >= t[1] 
                          /\ from.bird >= t[2]
                          /\ (from.wolf - t[1]) <= (from.bird - t[2]) \/ (from.bird - t[2]) = 0
                          /\ (to.wolf + t[1]) <= (to.bird + t[2]) \/ (to.bird + t[2]) = 0
 
(* Remainは、左岸にまだ動物が残っているかどうか *)
Remain == (LSide.wolf +  LSide.bird) /= 0
};
 
(* 左岸から右岸へボートを移動 *)
process ( LeftToRight = 0 )
    { l: while ( Remain )
         { await (boat.side = "left");
            (* ボートから降りる *)
             l_GetOff:
             LSide.wolf :=  LSide.wolf + boat.wolf || LSide.bird := LSide.bird + boat.bird;
             boat.wolf := 0 || boat.bird := 0;
            (* ボートに乗ることができる安全な組み合わせを選び、
               その組み合わせをボートに乗せて反対側の岸へ移動する *)
             l_GetOn:
             with(t \in {tuple \in OnBoat : safeBoats(LSide, RSide, tuple)} )
             {
                 LSide.wolf :=  LSide.wolf - t[1] || LSide.bird := LSide.bird - t[2];
                 boat.wolf := t[1] || boat.bird := t[2] || boat.side := "right";
             }
         }
    }
 
(* 右岸から左岸へボートを移動 *)
process ( RightToLeft = 1 )
    { r: while (Remain)
         { await (boat.side = "right");
             r_GetOff:
             RSide.wolf :=  RSide.wolf + boat.wolf || RSide.bird :=  RSide.bird + boat.bird;
             boat.wolf := 0 || boat.bird := 0;
 
             r_GetOn:
             with(t \in {tuple \in OnBoat : safeBoats(RSide, LSide, tuple)} )
             {
                 RSide.wolf := RSide.wolf - t[1] || RSide.bird := RSide.bird - t[2];
                 boat.wolf := t[1] || boat.bird := t[2] || boat.side := "left";
             };
         }
    }
}*)
\* BEGIN TRANSLATION
VARIABLES LSide, RSide, boat, OnBoat, pc
 
(* define statement *)
GetsEaten == /\ LSide.wolf >  LSide.bird /\ LSide.bird > 0
             /\ RSide.wolf >  RSide.bird /\ RSide.bird > 0
 
 
safeBoats(from, to, t) == /\ from.wolf >= t[1]
                          /\ from.bird >= t[2]
                          /\ (from.wolf - t[1]) <= (from.bird - t[2]) \/ (from.bird - t[2]) = 0
                          /\ (to.wolf + t[1]) <= (to.bird + t[2]) \/ (to.bird + t[2]) = 0
 
 
Remain == (LSide.wolf +  LSide.bird) /= 0
 
 
vars == << LSide, RSide, boat, OnBoat, pc >>
 
ProcSet == {0} \cup {1}
 
Init == (* Global variables *)
        /\ LSide = [wolf |-> 3, bird |->3]
        /\ RSide = [wolf |-> 0, bird |->0]
        /\ boat = [side |-> "left", wolf |-> 0, bird |->0]
        /\ OnBoat = {<<1,0>>,<<0,1>>,<<1,1>>,<<2,0>>, <<0,2>>}
        /\ pc = [self \in ProcSet |-> CASE self = 0 -> "l"
                                        [] self = 1 -> "r"]
 
l == /\ pc[0] = "l"
     /\ IF Remain
           THEN /\ (boat.side = "left")
                /\ pc' = [pc EXCEPT ![0] = "l_GetOff"]
           ELSE /\ pc' = [pc EXCEPT ![0] = "Done"]
     /\ UNCHANGED << LSide, RSide, boat, OnBoat >>
 
l_GetOff == /\ pc[0] = "l_GetOff"
            /\ LSide' = [LSide EXCEPT !.wolf = LSide.wolf + boat.wolf,
                                      !.bird = LSide.bird + boat.bird]
            /\ boat' = [boat EXCEPT !.wolf = 0,
                                    !.bird = 0]
            /\ pc' = [pc EXCEPT ![0] = "l_GetOn"]
            /\ UNCHANGED << RSide, OnBoat >>
 
l_GetOn == /\ pc[0] = "l_GetOn"
           /\ \E t \in {tuple \in OnBoat : safeBoats(LSide, RSide, tuple)}:
                /\ LSide' = [LSide EXCEPT !.wolf = LSide.wolf - t[1],
                                          !.bird = LSide.bird - t[2]]
                /\ boat' = [boat EXCEPT !.wolf = t[1],
                                        !.bird = t[2],
                                        !.side = "right"]
           /\ pc' = [pc EXCEPT ![0] = "l"]
           /\ UNCHANGED << RSide, OnBoat >>
 
LeftToRight == l \/ l_GetOff \/ l_GetOn
 
r == /\ pc[1] = "r"
     /\ IF Remain
           THEN /\ (boat.side = "right")
                /\ pc' = [pc EXCEPT ![1] = "r_GetOff"]
           ELSE /\ pc' = [pc EXCEPT ![1] = "Done"]
     /\ UNCHANGED << LSide, RSide, boat, OnBoat >>
 
r_GetOff == /\ pc[1] = "r_GetOff"
            /\ RSide' = [RSide EXCEPT !.wolf = RSide.wolf + boat.wolf,
                                      !.bird = RSide.bird + boat.bird]
            /\ boat' = [boat EXCEPT !.wolf = 0,
                                    !.bird = 0]
            /\ pc' = [pc EXCEPT ![1] = "r_GetOn"]
            /\ UNCHANGED << LSide, OnBoat >>
 
r_GetOn == /\ pc[1] = "r_GetOn"
           /\ \E t \in {tuple \in OnBoat : safeBoats(RSide, LSide, tuple)}:
                /\ RSide' = [RSide EXCEPT !.wolf = RSide.wolf - t[1],
                                          !.bird = RSide.bird - t[2]]
                /\ boat' = [boat EXCEPT !.wolf = t[1],
                                        !.bird = t[2],
                                        !.side = "left"]
           /\ pc' = [pc EXCEPT ![1] = "r"]
           /\ UNCHANGED << LSide, OnBoat >>
 
RightToLeft == r \/ r_GetOff \/ r_GetOn
 
(* Allow infinite stuttering to prevent deadlock on termination. *)
Terminating == /\ \A self \in ProcSet: pc[self] = "Done"
               /\ UNCHANGED vars
 
Next == LeftToRight \/ RightToLeft
           \/ Terminating
 
Spec == Init /\ [][Next]_vars
 
Termination == <>(\A self \in ProcSet: pc[self] = "Done")
 
\* END TRANSLATION 
 
 
=============================================================================
 

不変条件にRemainと~GetsEatenを指定し、モデルチェックを行うと~GetsEatenに違反せずにRemainが違反となる。
「川渡り問題」をウィキ内検索
LINE
シェア
Tweet

[Amazon商品]


TLA+メモ@ウィキ
記事メニュー

メニュー

  • トップページ
  • TLA+とは
  • ボイラープレート
  • 型 (Type)
  • 文法 (Syntax)
  • PlusCal構文
  • 時相論理 (temporal logic)
  • TLA+ TooolBox
  • よく使う表現
  • 例題


リンク

  • The TLA+ Home Page
  • TLA+ Foundation
  • TLA+ GitHub
  • TLA+ Video Course (YouTube)
  • Learn TLA+
  • @wiki
  • @wikiご利用ガイド


アクセス

今日: -
昨日: -
合計: -


ここを編集
記事メニュー2

人気のページ

  • TLA+とは
  • PlusCal構文
  • 食事する哲学者の問題
  • トップページ
  • 型 (Type)
  • 文法 (Syntax)
  • 時相論理 (temporal logic)
  • 例題
  • うそつき牛(レイトン教授)
  • ボイラープレート

更新履歴


編集履歴

取得中です。

ここを編集
最近更新されたページ
  • 178日前

    TLA+とは
  • 178日前

    メニュー
  • 553日前

    PlusCal構文
  • 737日前

    型 (Type)
  • 738日前

    時相論理 (temporal logic)
  • 755日前

    文法 (Syntax)
  • 893日前

    川渡り問題
  • 894日前

    例題
  • 898日前

    うそつき牛(レイトン教授)
  • 898日前

    食事する哲学者の問題
もっと見る
最近更新されたページ
  • 178日前

    TLA+とは
  • 178日前

    メニュー
  • 553日前

    PlusCal構文
  • 737日前

    型 (Type)
  • 738日前

    時相論理 (temporal logic)
  • 755日前

    文法 (Syntax)
  • 893日前

    川渡り問題
  • 894日前

    例題
  • 898日前

    うそつき牛(レイトン教授)
  • 898日前

    食事する哲学者の問題
もっと見る
ウィキ募集バナー
急上昇Wikiランキング

急上昇中のWikiランキングです。今注目を集めている話題をチェックしてみよう!

  1. 遊戯王DSNTナイトメアトラバドール攻略Wiki@わかな
  2. デジタルモンスター まとめ@ ウィキ
  3. Last Z: Survival Shooter @ ウィキ
  4. GUNDAM WAR Wiki
  5. ホワイトハッカー研究所
  6. オバマス検証@wiki
  7. アニヲタWiki(仮)
  8. とある魔術の禁書目録 Index
  9. MADTOWNGTAまとめwiki
  10. beatmania IIDX SP攻略 @ wiki
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ゲームカタログ@Wiki ~名作からクソゲーまで~
  3. MADTOWNGTAまとめwiki
  4. 初音ミク Wiki
  5. ストグラ まとめ @ウィキ
  6. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  7. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  8. 検索してはいけない言葉 @ ウィキ
  9. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  10. 英傑大戦wiki
もっと見る
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. MADTOWNGTAまとめwiki
  2. フォートナイト攻略Wiki
  3. MadTown GTA (Beta) まとめウィキ
  4. 首都圏駅メロwiki
  5. Last Z: Survival Shooter @ ウィキ
  6. まどドラ攻略wiki
  7. 駅のスピーカーwiki
  8. 魔法少女ノ魔女裁判 攻略・考察Wiki
  9. 漢字でGO 問題集 @wiki
  10. ちいぽけ攻略
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 【移転】Miss AV 見れない Missav.wsが見れない?!MissAV新URLはどこ?閉鎖・終了してない?missav.ai元気玉って何? - ホワイトハッカー研究所
  2. ブラック・マジシャン・ガール - 遊戯王DSNTナイトメアトラバドール攻略Wiki@わかな
  3. 真崎杏子 - 遊戯王DSNTナイトメアトラバドール攻略Wiki@わかな
  4. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  5. ブラック・マジシャン・ガール - アニヲタWiki(仮)
  6. ゴジュウユニコーン/一河角乃 - アニヲタWiki(仮)
  7. 参加者一覧 - ストグラ まとめ @ウィキ
  8. 参加者一覧 - MADTOWNGTAまとめwiki
  9. Pokémon LEGENDS Z-A - アニヲタWiki(仮)
  10. 辻 伸弘(NTTデータ先端技術株式会社) - IT人材像 @ ウィキ
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.