Mc157-951#
このディレクトリの索引
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) :-
        _必要量 is 3 - _3L容器現在量,
        _4L容器現在量 >= _必要量,
        _4L容器残量 is _4L容器現在量 - _必要量.
水を注ぐ('4L容器が一杯になるまで3L容器から注ぐ',_4L容器現在量,_3L容器現在量,4,_3L容器残量) :-
        _必要量 is 4 - _4L容器現在量,
        _3L容器現在量 >= _必要量,
        _3L容器残量 is _3L容器現在量 - _必要量.
水を注ぐ('4L容器から3L容器に注ぐ',_4L容器現在量,_3L容器現在量,0,_3L容器残量) :-
        _容器を一杯にするための必要量 is 3 - _3L容器現在量,
        _4L容器現在量 =< _容器を一杯にするための必要量,
        _3L容器残量 is _3L容器現在量 + _4L容器現在量.
水を注ぐ('3L容器から4L容器に注ぐ',_4L容器現在量,_3L容器現在量,_4L容器残量,0) :-
        _容器を一杯にするための必要量 is 4 - _4L容器現在量,
        _3L容器現在量 =< _容器を一杯にするための必要量,
        _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容器残量]).