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)
  • うそつき牛(レイトン教授)
  • ボイラープレート

更新履歴


編集履歴

取得中です。

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

    TLA+とは
  • 58日前

    メニュー
  • 434日前

    PlusCal構文
  • 618日前

    型 (Type)
  • 619日前

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

    文法 (Syntax)
  • 774日前

    川渡り問題
  • 775日前

    例題
  • 779日前

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

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

    TLA+とは
  • 58日前

    メニュー
  • 434日前

    PlusCal構文
  • 618日前

    型 (Type)
  • 619日前

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

    文法 (Syntax)
  • 774日前

    川渡り問題
  • 775日前

    例題
  • 779日前

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

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

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

  1. MadTown GTA (Beta) まとめウィキ
  2. AviUtl2のWiki
  3. R.E.P.O. 日本語解説Wiki
  4. シュガードール情報まとめウィキ
  5. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  6. ソードランページ @ 非公式wiki
  7. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  8. ドラゴンボール Sparking! ZERO 攻略Wiki
  9. 星飼いの詩@ ウィキ
  10. ヒカマーWiki
もっと見る
人気Wikiランキング

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

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

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

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. モンスター一覧_第2章 - モンスター烈伝オレカバトル2@wiki
  3. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  4. 高崎線 - 発車メロディーwiki
  5. 近藤旬子 - 馬主データベース@Wiki
  6. 地獄のデザイナーさん1 - 【トレパク】 きりつき 検証まとめwiki 【地獄のデザイナーさん】
  7. 召喚 - PATAPON(パタポン) wiki
  8. 細田守 - アニヲタWiki(仮)
  9. ステージ攻略 - パタポン2 ドンチャカ♪@うぃき
  10. 鬼レンチャン(レベル順) - 鬼レンチャンWiki
もっと見る

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

2019 AtWiki, Inc.