重複桁が多いほうから全探索するだけです。
m(10).
not_prime(N):-
between(2,N,D),
(N<D*D->!,fail;N mod D=:=0),
true,
!.
is_prime(N):-not(not_prime(N)).
search([],_,N,N):-
is_prime(N),
!.
search([X|Xs],Y,N,Res):-
integer(X),
N1 is N*10+X,
search(Xs,Y,N1,Res).
search([X|Xs],Y,N,Res):-
member(X,[0,1,2,3,4,5,6,7,8,9]),
X=\=Y,
N1 is N*10+X,
search(Xs,Y,N1,Res).
top([X|_],_,_):-
integer(X),
X=:=0,
!,
fail.
top([X|Xs],Y,Res):-
integer(X),
!,
search(Xs,Y,X,Res).
top([X|Xs],Y,Res):-
member(X,[1,2,3,4,5,6,7,8,9]),
X=\=Y,
search(Xs,Y,X,Res).
search2(Xs,_,Z,_):-
m(L),
length(Xs,L),
Z=\=0,
!,
fail.
search2(Xs,Y,0,Res):-
m(L),
length(Xs,L),
!,
top(Xs,Y,Res).
search2(Xs,Y,Z,Res):-
Z1 is Z-1,
search2([Y|Xs],Y,Z1,Res).
search2(Xs,Y,Z,Res):-
search2([_|Xs],Y,Z,Res).
search3(N,Res):-
m(Len),
Len1 is Len-1,
between(1,Len1,L),
L1 is Len-L,
findall(E,search2([],N,L1,E),Res),
Res\=[],
!.
sum([],Sum,Sum):-!.
sum([X|Xs],Sum,Res):-
Sum1 is Sum+X,
sum(Xs,Sum1,Res).
main111:-
findall(E,(between(0,9,N),search3(N,E)),Es),
flatten(Es,Es1),
sum(Es1,0,Ans),
write(Ans).
最終更新:2015年11月13日 10:07