このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1261057499/975
#  たしてちょうど15になる7個の自然数の組合せをすべて列挙するとともに、  
#  すべての組合せを表示し終えたら、それらの組合せが全部でいくつあるの  
#  かも出力するプログラムを作成しなさい。  
#   
#  #include<stdio.h>  
#   
#  int main(void)  
#  {  
#  int i,num;  
#   
#  printf("自然数の組合せ\n");  
#   
#  num=0;  
#   
#  for(i=1;num<=14;i++){  
#  num=num+i;  
#  printf("%d\t",i);  
#   
#  }  
#   
#  printf("組み合わせは%d通り\n",num);  
#   
#  return 0;  
#  }  
#   
#  現在ここまで作りましたが、プログラムがわかりません。  
#  誰か教えてください。  
#   
#  言語はC++  
#  環境はVisual です。  
# 
# 

たしてちょうど15になる7個の自然数の組合せをすべて列挙する([A,B,C,D,E,F,G]) :-
        たしてちょうど15になる7個の自然数候補の最大値(M),
        '1からMまでのならび'(M,L1),
        重複組合せ(L1,7,[A,B,C,D,E,F,G]),
        15 is A + B + C + D + E + F + G.

組合せが全部でいくつあるのか(_いくつ) :-
        いくつ(たしてちょうど15になる7個の自然数の組合せをすべて列挙する(L),_いくつ).

たしてちょうど15になる7個の自然数候補の最大値(N) :-
        for(14,N,1),
        M is 15 - N,
        '1からMまでのならび'(M,L1),
        重複組合せ(L1,6,L2),
        整数加算(L2,M),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

'1からMまでのならび'(M,L) :- findall(J,for(1,J,M),L).

重複組合せ(X,1,[A]) :- member(A,X).
重複組合せ([A|Y],N,[A|X]) :-
        N > 1,
        M is N - 1,
        重複組合せ([A|Y],M,X).
重複組合せ([_|Y],N,A) :-
        N > 1,
        重複組合せ(Y,N,A).

整数加算([],0) :- !.
整数加算([A|R],X) :- 整数加算(R,Y),X is A + Y.

いくつ(_目標,_いくつ) :- count(_目標,_いくつ).