not_prime(N):-N<2.
not_prime(N):-
between(2,N,D),
(D*D>N->!,fail;true),
N mod D=:=0,
!.
is_prime(N):-not(not_prime(N)).
oks(Ps,R,E2):-
member(E,Ps),
E2 is E^R,
E2<5000*10000.
cross(Ps,Ans,E3):-
member(E1,Ps),
member(E2,Ans),
E3 is E1+E2,
E3<5000*10000.
calc([],Ans):-
length(Ans,Ans1),
write(Ans1).
calc([Ps|Rest],Ans):-
findall(E2,cross(Ps,Ans,E2),Ans2),
sort(Ans2,Ans3),
calc(Rest,Ans3).
main:-
findall(E,(between(2,8000,E),is_prime(E)),Ps),
findall(E2,oks(Ps,2,E2),Ps2),
findall(E3,oks(Ps,3,E3),Ps3),
findall(E4,oks(Ps,4,E4),Ps4),
calc([Ps2,Ps3,Ps4],[0]).
最終更新:2014年12月19日 08:22