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

非プライマリを複製し、一度プライマリを与えるようです。

isPrime - うまく機能する私自身の関数です。

ここで何が間違っているのか、それを修正する方法を見つけることができますか?

4

1 に答える 1

2

の2番目の引数の先頭に常に要素を追加していますnprimes/2。次に、要素が素数の場合、2番目の引数にはまだ要素が含まれます。要素が素数でない場合は、2回追加されます。

それは読むべきです:

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