3

ハノイの塔問題の TLA+ 仕様を書きました。

TEX

ここに画像の説明を入力

アスキー

------------------------------- MODULE Hanoi -------------------------------

EXTENDS Sequences, Integers
VARIABLE A, B, C


CanMove(x,y) == /\ Len(x) > 0 
                /\ IF Len(y) > 0 THEN Head(y) > Head(x) ELSE TRUE

Move(x,y,z) == /\ CanMove(x,y)
               /\ x' = Tail(x)
               /\ y' = <<Head(x)>> \o y
               /\ z' = z

Invariant == C /= <<1,2,3>>   \* When we win!                           

Init == /\ A = <<1,2,3>>
        /\ B = <<>>
        /\ C = <<>>

Next == \/ Move(A,B,C) \* Move A to B
        \/ Move(A,C,B) \* Move A to C
        \/ Move(B,A,C) \* Move B to A
        \/ Move(B,C,A) \* Move B to C
        \/ Move(C,A,B) \* Move C to A
        \/ Move(C,B,A) \* Move C to B
=============================================================================

Invariant数式を不変式として指定すると、TLA モデル チェッカーがパズルを解いてくれます。

理想的には、変更されていない変数を に渡したくありませんが、Move()方法がわかりません。私がやりたいことは、書くことです

Move(x,y) == /\ CanMove(x,y)
             /\ x' = Tail(x)
             /\ y' = <<Head(x)>> \o y
             /\ UNCHANGED (Difference of and {A,B,C} and {y,x})

それをTLA言語でどのように表現できますか?

4

1 に答える 1

4

変数 A、B、C の代わりにtowers、タワーがインデックスである単一のシーケンス が必要です。これには、タワーの数が一般的であるという利点もあります。あなたのNext式も短くなります:

CanMove(i,j) == /\ Len(towers[i]) > 0 
                /\ Len(towers[j]) = 0 \/ Head(towers[j]) > Head(towers[i])

Move(i, j) == /\ CanMove(i, j)
              /\ towers' = [towers EXCEPT ![i] = Tail(@),
                                          ![j] = <<Head(towers[i])>> \o @]

Init == towers = << <<1,2,3>>, <<>>, <<>> >> \* Or something more generic

Next == \E i, j \in DOMAIN towers: i /= j /\ Move(i, j)

または、引き続き文字を使用したい場合は、 のシーケンスの代わりにレコードを使用できますtowers。私の提案する仕様で変更する必要があるのは、次のとおりです。

Init == towers = [a |-> <<1, 2, 3>>, b |-> <<>>, c |-> <<>>]
于 2016-06-14T06:39:37.703 に答える