Prolog - 省略范围内的所有主要数字[N-1,2]

时间:2013-01-17 20:27:50

标签: prolog primes

我尝试编写一个函数 - noPrime(X,Result),其中列出了[X-1,2]范围内的所有非主要数字。

例如 -

noPrime(9,Result).
Result = [8,6,4]

到目前为止,我尝试了以下内容 -

nprimes(4,[]) :- !.
nprimes(X,[H|Rest]) :- H is X-1,nprimes(H,NewRest),
    ( isPrime(H) -> Rest = NewRest; Rest = [H|NewRest]).

但它给出了 -

Result = [8, 8, 7, 6, 6, 5, 4, 4].

似乎它复制了非主要版本,并给出了一次主要版本。

isPrime - 是我自己的功能,效果很好。

你能在这里发现错误以及如何纠正错误吗?

1 个答案:

答案 0 :(得分:2)

您总是在nprimes/2的第二个参数的头部添加元素。 然后,如果元素是素数,则第二个参数仍然具有元素;如果元素不是素数,它将被添加两次。

应该是:

nprimes(X,Rest) :- H is X-1,nprimes(H,NewRest),
    ( isPrime(H) -> Rest = NewRest; Rest = [H|NewRest]).