我尝试编写一个函数 - 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 - 是我自己的功能,效果很好。
你能在这里发现错误以及如何纠正错误吗?
答案 0 :(得分:2)
您总是在nprimes/2
的第二个参数的头部添加元素。
然后,如果元素是素数,则第二个参数仍然具有元素;如果元素不是素数,它将被添加两次。
应该是:
nprimes(X,Rest) :- H is X-1,nprimes(H,NewRest),
( isPrime(H) -> Rest = NewRest; Rest = [H|NewRest]).