not_prime(N):-N<2,!. not_prime(N):- between(2,N,P), (P*P > N -> !,fail;N mod P=:=0,!). is_prime(N):-not(not_prime(N)). calc(A,B,N,N):- C is N^2+A*N+B, not_prime(C), !. calc(A,B,N,Result):- N1 is N+1, calc(A,B,N1,Result). search([Len,N]):- between(3,999,B), is_prime(B), between(-499,500,A0), A is A0*2-1, N is A*B, calc(A,B,1,Len). main:- findall(E,search(E),Es), sort(Es,Es1), reverse(Es1,[Top|_]), write(Top).