このディレクトリの索引
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 
# 
%
%  どうせなら '1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)+(1+3)+(1+4)+(1+5)'を生成して
%  それを利用して!計算したいものだ。
%

'整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。'(_n,_集計値) :-
        一桁ずつに分解した加算文字列ならび(_n,_一桁ずつに分解した加算文字列ならび),
        atomic_list_concat(_一桁ずつに分解した加算式文字列ならび,'+',_評価式文字列),
        atom_to_term(_評価式文字列,_評価式,_),
        _集計値 is _評価式.

一桁ずつに分解した加算文字列ならび(_n,_一桁ずつに分解した加算式文字列ならび) :-
        findall(_一桁ずつに分解した加算式文字列,(
                    between(1,_n,_整数),
                    number_chars(_整数,_一桁ずつに分解した数字ならび),
                    '二桁以上の時は括弧で括ってプラス演算子を挿入する'(_n,_一桁ずつに分解した数字ならび,_一桁ずつに分解した加算式文字列)),
              _一桁ずつに分解した加算式文字列ならび).

'二桁以上の時は括弧で括ってプラス演算子を挿入する'(_n,_一桁ずつに分解した数字ならび,_一桁ずつに分解した加算式文字列) :-
        _n < 10,
        atomic_list_concat(_一桁ずつに分解した数字ならび,'+',_一桁ずつに分解した加算式文字列).
'二桁以上の時は括弧で括ってプラス演算子を挿入する'(_n,_一桁ずつに分解した数字ならび,_一桁ずつに分解した括弧で括られた加算式文字列) :-
        _n >= 10,
        atomic_list_concat(_一桁ずつに分解した数字ならび,'+',_一桁ずつに分解した加算式文字列),
        atomic_list_concat(['(',_一桁ずつに分解した加算式文字列,')'],_一桁ずつに分解した括弧で括られた加算式文字列).