このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1258158172/432
#  [1] 授業単元:暇なヤシ集まれ 
#  [2] 問題文(含コード&リンク): 
#   最大10桁の数字列sと 10000 以下の正整数dが 
#   与えられたとき、sの各数字を並べ替えて出来る全 
#   ての数の中で、dで割り切れる数の総数を求める。 
#   
#   計算例) s, d => 解 
#   ・ 000, 1 => 1 
#   ・ 1234567890, 1 => 3628800 
#   ・ 123434, 2 => 90 
# 

'最大10桁の数字列sと 10000 以下の正整数dが与えられたとき、sの各数字を並べ替えて出来る全ての数の中で、dで割り切れる数の総数を求める'(_数字ならび,D,X) :-
    length(_数字ならび,Len),
    Len =< 10,
    D < 10000,
    findall(Y,(数字ならびから順列整数(_数字ならび,Len,Y),0 is Y mod D),L),
    sort(L,L2),
    length(L2,X).

数字ならびから順列整数(Y,0,0).
数字ならびから順列整数(Y,N,X) :-
    del(Z = Y - A),
    M is N - 1,
    数字ならびから順列整数(Z,M,X2),
    X is truncate(10^M*A+X2).