Qual é o gargalo nesse predicado relacionado aos primos?

Então aqui está: estou tentando calcular a soma de todos os números primos abaixo de dois milhões (paraeste problem), mas meu programa é muito lento. Eu sei que o algoritmo em si é terrivelmente ruim e uma força bruta, mas parece muito mais lento do que deveria para mi
Aqui limito a pesquisa a 20.000, para que o resultado não seja esperado por muito temp
Eu não acho que esse predicado seja difícil de entender, mas vou explicar de qualquer maneira: calculo a lista de todos os números primos abaixo de 20.000 e depois os somatório. A parte da soma é boa, a parte dos primos é muito lent

problem_010(R) :-
    p010(3, [], Primes),
    sumlist([2|Primes], R).
p010(20001, Primes, Primes) :- !.
p010(Current, Primes, Result) :-
    (
        prime(Current, Primes)
    ->  append([Primes, [Current]], NewPrimes)
    ;   NewPrimes = Primes
    ),
    NewCurrent is Current + 2,
    p010(NewCurrent, NewPrimes, Result).
prime(_, []) :- !.
prime(N, [Prime|_Primes]) :- 0 is N mod Prime, !, fail.
prime(ToTest, [_|Primes]) :- prime(ToTest, Primes).

Gostaria de ter uma ideia de por que é tão lento. É uma boa implementação do algoritmo estúpido de força bruta ou existe algum motivo para fazer o Prolog cair?

EDIT: Eu já encontrei algo, acrescentando novos números primos em vez de deixá-los no topo da lista, eu tenho números primos que ocorrem com mais frequência no início, por isso é ~ 3 vezes mais rápido. Ainda precisamos de algumas dicas:)

questionAnswers(4)

yourAnswerToTheQuestion