0

set_value_in_array というルールがあります。彼は Array[J] の値を Val に置き換えます。

set_value_in_array([], _, _, _, _).
set_value_in_array([Head | Array], Val, J, AccJ, NewArray) :-
    AccJ = J,
    NewAccJ is AccJ + 1,
    set_value_in_array(Array, Val, J, NewAccJ, [Val  | NewArray])
    ;
    NewAccJ is AccJ + 1,
    set_value_in_array(Array, Val, J, NewAccJ, [Head | NewArray]).

 -----------------------------
 -----------------------------

% execute in terminal
?- set_value_in_array([1,2,3], 10, 1, 0, NewArray).

true ;
true.

set_value_in_array が NewArray を [1, 10, 3] と表示しないのはなぜですか? 彼は常に真を返します。

アップデート:

set_value_in_array([], Val, J, AccJ, NewArray) を実行すると:- write(NewArray)。彼は正しい解決策に見えるものを返します

?- set_value_in_array([1,2,3,4,5,6],100,1,0,X).
[6, 5, 4, 3, 100, 1|_G516]
true.

しかし、書き込み機能なしで機能させるにはどうすればよいですか?

4

1 に答える 1

1

コードの主な問題は、結果を正しく構築していないことです。それは逆でなければなりません:

set_value_in_array([Head | Array], Val, J, AccJ, [Head | NewArray]) :-

    set_value_in_array(Array, Val, J, NewAccJ, NewArray)

コードには他にもいくつかの問題があります。一般に、リストの最初の要素を削除するときの小さいケースと、基本ケースを慎重に検討する必要があります (そこに結果リストを指定しないでください)。

AccJ \== J2 番目のケースでもそれを指定する必要があります。

于 2011-09-15T19:39:25.037 に答える