このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1276873238/652
#  問題 
#  整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。 
#  例 
#  n=15のとき 
#  1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)+(1+3)+(1+4)+(1+5) = 66 
# 
# 
%
%  これは数値演算を行わず、変数リストの要素数だけで集計するプログラム。
%  ただし、桁の分解にリストの割り算を使用せず、リストを数値に戻して、number_chars/2を使っている。
%

'整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。'(_n,_集計値) :-
        length(Ln,_n),
        すべてを1桁に分解して集計する([_],Ln,[],_集計値).

すべてを1桁に分解して集計する(Ln,Ln,LL1,_集計値) :-
        すべてを1桁に分解して(Ln,LL1,LL2),
        平坦化(LL2,L),
        length(L,_集計値),!.
すべてを1桁に分解して集計する(Ln_1,Ln,LL1,_集計値) :-
        すべてを1桁に分解して(Ln_1,LL1,LL2),
        すべてを1桁に分解して集計する([_|Ln_1],Ln,LL2,_集計値).

すべてを1桁に分解して(Ln,LL1,LL2) :-
        length(Ln,M),
        number_chars(M,L),
        findall(L1,(
                    member(A,L),
                    数字ならび表現変換(A,L1)),
                LL),
        append(LL,LL1,LL2).


数字ならび表現変換('1',[_]).
数字ならび表現変換('2',[_,_]).
数字ならび表現変換('3',[_,_,_]).
数字ならび表現変換('4',[_,_,_,_]).
数字ならび表現変換('5',[_,_,_,_,_]).
数字ならび表現変換('6',[_,_,_,_,_,_]).
数字ならび表現変換('7',[_,_,_,_,_,_,_]).
数字ならび表現変換('8',[_,_,_,_,_,_,_,_]).
数字ならび表現変換('9',[_,_,_,_,_,_,_,_,_]).


%  平坦化/2