このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1335517816/951
#  [1] 授業単元:
#  [2] 問題文(含コード&リンク):
#  水差し問題です
#  
#  4リットル、3リットルの二つの容器で、4リットル容器に2リットルを溜める。

'4リットル、3リットルの二つの容器で、4リットル容器に2リットルを溜める' :-
        '4リットル、3リットルの二つの容器で、4リットル容器に2リットルを溜める'(0,0,[[初期状態,0,0]],_逆順履歴),
        逆順履歴から正順履歴を表示する(_逆順履歴).

'4リットル、3リットルの二つの容器で、4リットル容器に2リットルを溜める'(2,_,_逆順履歴,_逆順履歴).
'4リットル、3リットルの二つの容器で、4リットル容器に2リットルを溜める'(_4L容器現在量,_3L容器現在量,_逆順履歴_1,_逆順履歴) :-
        水を注ぐ(_処理概要,_4L容器現在量,_3L容器現在量,_4L容器残量,_3L容器残量),
        \+(member([_,_4L容器残量,_3L容器残量],_逆順履歴_1)),
        '4リットル、3リットルの二つの容器で、4リットル容器に2リットルを溜める'(_4L容器残量,_3L容器残量,[[_処理概要,_4L容器残量,_3L容器残量]|_逆順履歴_1],_逆順履歴).

水を注ぐ('3L容器が一杯になるまで4L容器から注ぐ',_4L容器現在量,_3L容器現在量,_4L容器残量,3) :-
        _4L容器現在量 >= (3 - _3L容器現在量),
        _4L容器残量 is _4L容器現在量 - (3 - _3L容器現在量).
水を注ぐ('4L容器が一杯になるまで3L容器から注ぐ',_4L容器現在量,_3L容器現在量,4,_3L容器残量) :-
        _3L容器現在量 >= (4 - _4L容器現在量),
        _3L容器残量 is _3L容器現在量 - (4 - _4L容器現在量).
水を注ぐ('4L容器から3L容器に注ぐ',_4L容器現在量,_3L容器現在量,0,_3L容器残量) :-
        _4L容器現在量 =< (3 - _3L容器現在量),
        _3L容器残量 is _3L容器現在量 + _4L容器現在量.
水を注ぐ('3L容器から4L容器に注ぐ',_4L容器現在量,_3L容器現在量,_4L容器残量,0) :-
        _3L容器現在量 =< (4 - _4L容器現在量),
        _4L容器残量 is _4L容器現在量 + _3L容器現在量.
水を注ぐ('4L容器に水を補充する',_4L容器現在量,_3L容器現在量,4,_3L容器現在量).
水を注ぐ('3L容器に水を補充する',_4L容器現在量,_3L容器現在量,_4L容器現在量,3).
水を注ぐ('4L容器の水を捨てる',_4L容器現在量,_3L容器現在量,0,_3L容器現在量).
水を注ぐ('3L容器の水を捨てる',_4L容器現在量,_3L容器現在量,_4L容器現在量,0).

逆順履歴から正順履歴を表示する([]).
逆順履歴から正順履歴を表示する([[_処理概要,_4L容器残量,_3L容器残量]|R]) :-
        逆順履歴から正順履歴を表示する(R),
        writef('%22r 4L容器残量=%t 3L容器残量=%t\n',[_処理概要,_4L容器残量,_3L容器残量]).