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).