2013-01-17 22 views
-1

我试图编写一个功能 - noPrime(X,Result),它给出了范围为[X-1,2]的所有非主号码的列表。Prolog - 省略范围[N-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 - 这是我自己的功能,效果很好。

你能检测到这里有什么问题以及如何纠正它吗?

+0

为 “非主号码” 的术语是*合数*) – Haile

+0

相关:http://stackoverflow.com/questions/8311046/what-is-the -bottleneck功能于这个-素数相关的谓词 – false

回答

2

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

它应该阅读:

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