2017-10-28 1 views
2

プロローグの基本的なプログラミングを学んでいますが、いくつかの問題があります。私はプロローグでappendを使ってリストから最初のX個の要素を削除しています(Xは入力した任意の乱数です)。リストが空で、リストに含まれている以上のものを要求したときに、プログラムは問題に遭遇します。それは[]を返すべきです。入力例: 取り外し可能な(R、[1,2,3、A]、5)リストが空のときにプロローグプログラムを続行しないようにするには

答えて

1
removable(A,B,N) :- length(X,N), append(X, A, B). 

このようlengthappendの使用を避けるようにしてください。それはあなたのコードを多くのリストを通して繰り返します。

代わりに、これを試してみてください。

removable(0,R,R). 
removable(X,[],[]) :- X > 0. 
removable(X,[H|T],R) :- X > 0, Y is X - 1, removable(Y,T,R). 

私は入力が右に左と出力にある規則に従うためにあなたの引数の順序を変更しましたのでご注意ください。

あなたの呼び出しは次のようになります。

?- removable(5,[1,2,3,a],R), write(R). 

[]を出力します。

-1

プロローグでは、再帰を使用して作業し、リストの先頭と末尾を処理してください。インスタンス化された3つのすべてのvaiablesがあるので、プロローグでaを使用してeのような用語をインスタンス化することはできません。

removable(A,B,N) :- 
    removable(A,B,N,0). % This is just another call with accumulator. 



removable(L,L,Acc,Acc). %This is your base case, When Acc and Acc will equal then prolog will find one succesive branch. 

removable([],[],_,_). %This base case says that no matter what values Accs have if a list is emepty then substitue other also with empty list and return result. 

removable(R,[H|T],N,Acc) :- %This predicates removes H and keeps counting when removed elements equal to N then first(base case) will succeed. 
    NewAcc is Acc + 1, 
    removable(R,T,N,NewAcc). 

関連する問題