このディレクトリの索引
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リットルを溜める'(_現在量_1,_現在量_2,_逆順履歴_1,_逆順履歴) :-
        水を注ぐ(_処理概要,4,_現在量_1,3,_現在量_2,_残量_1,_残量_2),
        \+(member([_,_残量_1,_残量_2],_逆順履歴_1)),
        '4リットル、3リットルの二つの容器で、4リットル容器に2リットルを溜める'(_残量_1,_残量_2,[[_処理概要,_残量_1,_残量_2]|_逆順履歴_1],_逆順履歴).

水を注ぐ(容器_2が一杯になるまで容器_1から注ぐ,_容量_1,_現在量_1,_容量_2,_現在量_2,_残量_1,_容量_2) :-
        _必要量 is _容量_2 - _現在量_2,
        _現在量_1 >= _必要量,
        _残量_1 is _現在量_1 - _必要量.
水を注ぐ(容器_1が一杯になるまで容器_2から注ぐ,_容量_1,_現在量_1,_容量_2,_現在量_2,_容量_1,_残量_2) :-
        _必要量 is _容量_1 - _現在量_1,
        _現在量_2 >= _必要量,
        _残量_2 is _現在量_2 - _必要量.
水を注ぐ(容器_1から容器_2に注ぐ,_容量_1,_現在量_1,_容量_2,_現在量_2,0,_残量_2) :-
        _容器を一杯にするための必要量 is _容量_2 - _現在量_2,
        _現在量_1 =< _容器を一杯にするための必要量,
        _残量_2 is _現在量_2 + _現在量_1.
水を注ぐ(容器_2から容器_1に注ぐ,_容量_1,_現在量_1,_容量_2,_現在量_2,_残量_1,0) :-
        _容器を一杯にするための必要量 is _容量_1 - _現在量_1,
        _現在量_2 =< _容器を一杯にするための必要量,
        _残量_1 is _現在量_1 + _現在量_2.
水を注ぐ(容器_1に水を補充する,_容量_1,_現在量_1,_容量_2,_現在量_2,_容量_1,_現在量_2).
水を注ぐ(容器_2に水を補充する,_容量_1,_現在量_1,_容量_2,_現在量_2,_現在量_1,_容量_2).
水を注ぐ(容器_1の水を捨てる,_容量_1,_現在量_1,_容量_2,_現在量_2,0,_現在量_2).
水を注ぐ(容器_2の水を捨てる,_容量_1,_現在量_1,_容量_2,_現在量_2,_現在量_1,0).

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