このディレクトリの索引
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]],_逆順履歴),
        reverse(_逆順履歴,_履歴).

'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],_逆順履歴).

水を注ぐ(ちょうど一杯になるまで注ぐ,_容量_1,_現在量_1,_容量_2,_現在量_2,_残量_1,_容量_2) :-
        _現在量_1 >= (_容量_2 - _現在量_2),
        _残量_1 is _現在量_1 - (_容量_2 - _現在量_2).
水を注ぐ(全部他方の容器に注ぐ,_容量_1,_現在量_1,_容量_2,_現在量_2,0,_容量_2) :-
        _現在量_1 =< (_容量_2 - _現在量_2),
        _残量_2 is _現在量_2 + _現在量_1.
水を注ぐ(容器に水を補充する,_容量_1,_現在量_1,_容量_2,_現在量_2,_容量_1,_現在量_2).
水を注ぐ(容器の水を捨てる,_容量_1,_現在量_1,_容量_2,_現在量_2,0,_現在量_2).
水を注ぐ(_処理概要,_容量_1,_現在量_1,_容量_2,_現在量_2,_残量_1,_残量_2) :-
        _容量_1 > _容量_2,
        水を注ぐ(_処理概要,_容量_2,_現在量_2,_容量_1,_現在量_1,_残量_2,_残量_1).