ブロックを移動させたり積み上げたりする問題。
テーブルに置いてある2個のブロックを積み上げる問題
最初の状態
('a on table', 'b on table', 'space on a', 'space on b', 'space on table')
実行結果
[('executing', 'move a from table to b')]
AをテーブルからBの上へ移動させます。
3つの積み上がったブロックを逆順に積み直す。
上からABCと積み上がったブロックを逆順のCBAに積み直す。
積み上がった状態はこう。
('a on b', 'b on c', 'c on table', 'space on a', 'space on table')
実行結果
[('executing', 'move a from b to table'), ('executing', 'move b from c to table'), ('executing', 'move b from table to a')]
3つのブロックを全てテーブルに下ろし、Aの上にBを乗せるところまで動きます。
全部積み上げようとすると、The Clobbered Sibling Goal Problemが発生します。Aの上にBが乗っている状態(a on b)から、なぜかBをテーブルに下ろしてCを乗せてしまいます。その結果、a on bのgoalが達成できなくなるので、GPSが失敗を返します。教科書のCommon Lispの実装とは少し結果が異なります。本来ならバックトラックを行って新しいオペレーションを試せばよいのですが、今の実装だとThe Clobbered Sibling Goal Problemが発生しているかどうかのチェックしかしていないのでここまです。
ソースはGithubに。
https://github.com/natsutan/PAIP/tree/master/ch4