読者です 読者をやめる 読者になる 読者になる

project euler problem 10 answer ?

32bitのCPUでSWI-Prologを動かした場合local stackの上限が128MByteに設定されてしまっているため、以下のプログラムではオーバーフローを起こして動作しない。

が、その制限を除けば正しいプログラムだと思う。何とかしたい!

primes_new(Primes) :- Primes = [2, [[2|Tail], Tail]].
primes(Primes, Prime, NextPrimes) :-
        [Prime, _] = Primes,
        primes_next(Primes, NextPrimes).
primes_next([Prime, [Head, Appender]], NextPrimes) :-
        P1 is Prime + 1,
        (primes_is_prime(P1, Head, Appender),
         Appender = [P1 | Tail],
         NextPrimes = [P1, [Head, Tail]];
         primes_next([P1, [Head, Appender]], NextPrimes)).
primes_is_prime(P, Primes, Tail) :-
        [Head | Rest] = Primes,
        (P < Head*Head;
         P mod Head =\= 0, primes_is_prime(P, Rest, Tail)).
primes_is_prime(_, Tail, Tail).

primes_sum(BelowN, Sum) :-
        primes_new(Primes),
        primes_sum_sub(BelowN, Primes, 0, Sum).
primes_sum_sub(N, Primes, Acc, Sum) :-
        primes(Primes, Prime, NextPrimes),
        (primes_sum_is_last(N, Prime,Acc, Sum);
         Acc1 is Acc + Prime,
         primes_sum_sub(N, NextPrimes, Acc1, Sum)).
primes_sum_is_last(N, Prime, Acc, Acc) :- N < Prime.

problem10(Result) :-
        primes_sum(2000000, Result).