このディレクトリの索引
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 
# 

%
%  これは数値演算を行わず、変数リストの要素数だけで集計するプログラム。
%

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

すべてを1桁に分解して集計する([],L,L).
すべてを1桁に分解して集計する([_|Ln],L1,L) :-
        すべてを1桁に分解して([_|Ln],L1,L2),
        すべてを1桁に分解して集計する(Ln,L2,L).

すべてを1桁に分解して([],L,L).
すべてを1桁に分解して(Ln,L1,L) :-
        ならび割り算(Ln,[_,_,_,_,_,_,_,_,_,_],Lx,Lmod),
        append(Lmod,L1,L2),
        すべてを1桁に分解して(Lx,L2,L).


ならび割り算(L1,L2,Div,Div,L1) :-
        append([_|_],L1,L2),!.
ならび割り算(L1,L2,L4,Div,Mod) :-
        append(L2,L3,L1),
        ならび割り算(L3,L2,[_|L4],Div,Mod).

ならび割り算(L1,L2,Div,Mod) :-
        ならび割り算(L1,L2,[],Div,Mod),!.
ならび割り算(L1,L2,L,L) :-
        append([_|_],L1,L2).
ならび割り算(L1,L2,L4,L) :-
        append(L2,L3,L1),
        ならび割り算(L3,L2,[_|L4],L).


ならび割り算(L1,L2,X) :-
        ならび割り算(L1,L2,[],X).