このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1276873238/693
#  問題 
#   
#  左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求めよ。 
#  例 
#  89 => 8^1 + 9^2 = 89 OK 
#  123 => 1^1 + 2^2 + 3^3 = 14 NG 
# 

'左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求める'(_4桁以下の数) :-
        '0から9999までの数'(_4桁以下の数),
        '4桁以下の数を数ならびに変換'(_4桁以下の数,_数ならび),
        左端からn桁目の数のn乗を合計(_数ならび,_4桁の整数).

'0から9999までの数'(_0から9999までの数) :-
        between(0,9999,_0から9999までの数).

'4桁以下の数を数ならびに変換'(_4桁以下の数,_数ならび) :-
        '4桁以下の数を数字ならびに変換'(_4桁以下の数,_数字ならび),        
        findall(_数,(
                    数字ならびの中の数字(_数字ならび,_数字),
                    数字を数に変換(_数字,_数)),
                _数ならび).

'4桁以下の数を数字ならびに変換'(_4桁以下の数,_数字ならび) :-
        number_chars(_4桁以下の数,_数字ならび).

数字ならびの中の数字(_数字ならび,_数字) :-
        member(_数字,_数字ならび).

数字を数に変換(_数字,_数) :-
        atom_number(_数字,_数).

左端からn桁目の数のn乗を合計(_数字ならび,_4桁の整数) :-
        findsum(X,(
                    'n番目(1から始めて)の数を取り出す'(_数ならび,_n番目,_数),
                    n乗する(_数,_n番目,X)),
                _4桁以下の数).

n乗する(_数,_n,X) :-
        X is truncate(_数 ^ _n).

'n番目(1から始めて)の数を取り出す'(_数ならび,_n番目,_数) :-
        nth1(_n番目,_数ならび,_数).