このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1376111807/98
#  '10円と100円と1000円の買い物をした時に払う
#  金額のリストを考えてみました
#  
#  map(sum)[[x,y,z]|x<-[0,10],y<-[0,100],z<-[0,1000]]
#  
#  これを任意の組に拡張するには
#  どういう方法があるでしょうか?
#  

'10円と100円と1000円の買い物をした時に払う
金額のリストを考えてみました

map(sum)[[x,y,z]|x<-[0,10],y<-[0,100],z<-[0,1000]]

これを任意の組に拡張するには
どういう方法があるでしょうか?'(_買い物をした時に支払う金額ならび,_金額組合せ) :-
買い物をした時に払う金額(_買い物をした時に支払う金額ならび,_重複を許す金額ならび),
sort(_重複を許す金額ならび,_金額組合せ).

買い物をした時に払う金額(_買い物をした時に支払う金額ならび,_金額ならび) :-
length(_買い物をした時に支払う金額ならび,_ならびの長さ),
findall(_金額,
買い物をした時に払う金額候補を得る(_買い物をした時に支払う金額ならび,_ならびの長さ,_金額)),_金額ならび).


買い物をした時に払う金額候補を得る(_買い物をした時に支払う金額ならび,_ならびの長さ,_金額) :-
ならびの長さを上限として支払い枚数(_支払い枚数),
可能な組み合わせ金額(_買い物をした時に支払う金額ならび,_支払い枚数,金額).

ならびの長さを上限として支払い枚数(_支払い枚数) :-
between(1,_ならびの長さ,_支払い枚数).

可能な組み合わせ金額(_買い物をした時に支払う金額ならび,_支払い枚数,金額) :-
組合せ(_買い物をした時に支払う金額ならび,_支払い枚数,_貨幣ならび),
sum_list(_貨幣ならび,_金額).

組合せ(L,1,[A]) :-
member(A,L).
組合せ([A|R1],N,[A|R2]) :-
'Nを1減らして残り要素の組合せ'(R1,N,R2).
組合せ([_|R1],N,R2) :-
'Nはそのままで残り要素の組合せ'(R1,N,R2).

'Nを1減らして残り要素の組合せ'(R1,N,R2) :-
N > 1,
succ(N_1,N),
組合せ(R1,N_1,R2).

'Nはそのままで残り要素の組合せ'(R1,N,R2) :-
N > 1,
組合せ(R1,N,R2).