置き換えから計算。
計算時間0.7秒、遅いけど処理がきれいなのでまあいいかな。
not_prime(N):-N<2,!.
not_prime(N):-
between(2,N,D),
(D^2>N->!,fail;true),
N mod D=:=0,
!.
is_prime(N):-not(not_prime(N)).
seed([_,_,_,_]):-!.
ok([X|_]):-X>0.
set([]):-!.
set([X|Xs]):-
member(X,[0,1,2,3,4,5,6,7,8,9]),
set(Xs).
set2([],[]):-!.
set2([X|Xs],Ys):-
select(X,Ys,Ys1),
set2(Xs,Ys1).
to_num([],N,N):-!.
to_num([X|Xs],N,Result):-
N1 is N*10+X,
to_num(Xs,N1,Result).
search([A1,B1,C1]):-
seed(A),
seed(B),
seed(C),
set(A),
ok(A),
to_num(A,0,A1),
is_prime(A1),
set2(B,A),
to_num(B,0,B1),
A1<B1,
is_prime(B1),
set2(C,A),
to_num(C,0,C1),
B1<C1,
is_prime(C1),
B1-A1=:=C1-B1.
main:-
findall(E,search(E),Es),
sort(Es,Ans),
write(Ans).
最終更新:2014年12月07日 08:28