2017-01-13 13 views
1

基本的に最初のNの数字をリストから削除したい場合は、数字が素数であるかどうかをチェックする関数がうまくいくように見えますが、プログラム自体はリストから最初のN個の素数を削除する(プロローグ)

入力 [2,4,5,7,6,9,11]N = 3ため例えば

私は[4, 6, 9, 11]を取得する必要がありますが、私は唯一の[4, 6, 9]を取得します。

divisible(X,Y) :- 
    0 is X mod Y, !. 
divisible(X,Y) :- 
    X > Y+1, 
    divisible(X, Y+1). 

%isPrime function check whether or not the argument is a prime number 
isPrime(2) :- true,!. 
isPrime(X) :- X < 2,!,false. 
isPrime(X) :- not(divisible(X, 2)). 

%delFunction (input_list, N, output_list) 
delFunction([],_,_). 
delFunction(_,0,_). 
delFunction([H|T], N, [H|Res]):- 
    not(isPrime(H)), !, 
    delFunction(T, N, Res). 
delFunction([_|T], N, Res):- 
    N1 is N-1, 
    delFunction(T,N1,Res). 

delFunction([2,4,5,7,6,9,11],3,X) - (正解ではありません)>[4,6,9]私が間違っていたところ

は正直なところ、私は知りませんが、実装のアイデアはかなり簡単ようで、まっすぐ進むので、コードです。

また、私はそれを実行すると[4]で停止し、実行の最後(結果)に私を得るために私は次をクリックし続ける必要があります。どのようにそれを修正するための任意のアイデア?多分私はいくつかのカットが必要かもしれないが、どこが分からないかもしれないと思っている。

PS:私はむしろ使用しないと思います組み込み関数

+0

さて、これらは私の問題です。最終的な出力が正しくなく、私に複数の答えが与えられます(明らかに1つしかない場合)。それはまだそれの悪用だと思う!どこかで... – Hansewl

答えて

2

全ての拳、代わりに

delFunction([],_,_). 

のあなたが

を書くべきを(このシナリオで役立つだろうともしあれば)
delFunction([],_,[]). 

入力リスト(左のもの)が空の場合は、出力リストのベースを作成する必要があります。空のリストです。 delFunction([], _, _)で出力リストを空のリストと統一しないので、結果は統一されていない変数で終わります。

秒。代わりに

delFunction(_,0,_). 

のあなたは問題が同じである

delFunction(L,0,L). 

を書く必要があります。数がゼロであるときは、「コピー」を出力して入力することができます。つまり、それらを統一することができます。つまり、delFunction(L,0,L)です。 delFunction(_,0,_)を使用すると、統一されず、結果は統一されていない変数で終わります。

第3。あるプライム句

delFunction([_|T], N, Res):- 
    N1 is N-1, 
    delFunction(T,N1,Res). 

では、Nがゼロ

delFunction([_|T], N, Res):- 
    N > 0, 
    N1 is N-1, 
    delFunction(T,N1,Res). 

か、あなたが好むならば、あなたは

ゼロ句でカット( !)を追加する必要がありますよりも大きいことを確認する必要があります
delFunction(L,0,L) :- !. 

Prologをバックトラック経由で回避すると、複数の望ましくない回答が返されることがあります。

--- EDIT ---ガイコーダーとして

、私は疫病のようなカットを避けます。そこで私は、望ましくない繰り返しを避けるために次の解決法を提案します。

delFunction([], _, []). 

delFunction([H | T], 0, [H | T]). 

delFunction([H | T], N, [H | Res]) :- 
    N > 0, 
    not(isPrime(H)), 
    delFunction(T, N, Res). 

delFunction([H | T], N, Res):- 
    N > 0, 
    isPrime(H), 
    N1 is N-1, 
    delFunction(T, N1, Res). 
+0

@GuyCoder - 呼びますか? 'delFunction([2,4,5,7,6,9,11]、3、X)'で? – max66

+0

ありがとう、本当に助けて、それは今働き、1つの答えしか与えません。 – Hansewl

+0

@GuiCoder - swi-prologを使用すると答えは1つしかありませんが、gprologを使用すると3になります。 'N> 0'を' not(isPrime()) 'の前に追加します。 – max66

関連する問題