このディレクトリの索引

# # 「キミならどう書く 2.0 ? 2007 ? その 1」より # # 斗桶 (a) に油が 1 斗 (10 升) ある。これを等分したい。7 升枡 (b) と 3 升枡 (c) しかない。この 2 つの枡だけで、5 升ずつ等分する方法を記述せよ。 # '斗桶 (a) に油が 1 斗 (10 升) ある。これを等分したい。7 升枡 (b) と 3 升枡 (c) しかない。この 2 つの枡だけで、5 升ずつ等分する方法を記述せよ。'(_履歴) :- 移動(10,0,0,[[10,0,0]],_履歴_1), reverse(_履歴_1,_履歴). 移動(5,5,0,_履歴,[[5,5,0]|_履歴]) :- !. 移動(A,B,C,_履歴_1,_履歴) :- 順列([a,b,c],2,[X,Y]), 移動(X,Y,A,B,C,A2,B2,C2), \+(member([A2,B2,C2],_履歴_1)), 移動(A2,B2,C2,[[A2,B2,C2]|_履歴_1],_履歴). 移動(a,b,A,B,C,0,B2,C) :- A =< (7 - B), B2 is A + B,!. 移動(a,b,A,B,C,A2,7,C) :- A > (7 - B), A2 is A - (7 - B),!. 移動(a,c,A,B,C,0,B,C2) :- A =< (3 - C), C2 is A + C,!. 移動(a,c,A,B,C,A2,B,3) :- A > (3 - C), A2 is A - (3 - C),!. 移動(b,a,A,B,C,A2,0,C) :- A2 is A + B,!. 移動(c,a,A,B,C,A2,B,0) :- A2 is A + C,!. 移動(b,c,A,B,C,A,0,C2) :- B =< (3 - C), C2 is B + C,!. 移動(b,c,A,B,C,A,B2,3) :- B > (3 - C), B2 is B - (3 - C),!. 移動(c,b,A,B,C,A,B2,0) :- C =< (7 - B), B2 is B + C,!. 移動(c,b,A,B,C,A,7,C2) :- C > (7 - B), C2 is C - (7 - B),!. 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % (10-0-0)>(3-7-0)>(3-4-3)>(6-4-0)>(6-1-3)>(9-1-0)>(9-0-1)>(2-7-1)>(2-5-3)>(5-5-0)