-1

我试图编写一个函数 -noPrime(X,Result)它给出了 range 中所有非主数的列表[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].

似乎它复制了 non-primary 并给出了一次 primary 。

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

你能发现这里有什么问题以及如何纠正它吗?

4

1 回答 1

2

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

它应该是:

nprimes(X,Rest) :- H is X-1,nprimes(H,NewRest),
    ( isPrime(H) -> Rest = NewRest; Rest = [H|NewRest]).
于 2013-01-17T20:33:50.870 回答