2011-09-15 18 views
0

私はset_value_in_arrayという規則を持っています。 彼はValによってArray [J]に値を返します。配列の値を設定する -

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は[1、10、3]としてNewArrayを表示しないのですか? 彼はいつも真実を返します。

更新:

私は set_value_in_array([]、ヴァル、J、ACCJ、NEWARRAY)の操作を行います。 - 書き込み(NEWARRAYを)。 彼は何かが

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

しかし、どのように、それは書き込み機能なしで動作させるために適切なソリューションになります戻るのですか?

+0

更新された質問 – nub

+0

http://pastie.org/2538878 - 私の簡単な愚かな解決策。しかし、それは動作します – nub

答えて

1

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

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

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

また、コードにいくつかの問題があります。一般的には、リストの最初の要素を削除したときのより小さなケースと、ベースケースが何であるかを注意深く考える必要があります(結果リストを指定しないでください)。

また、第2のケースではAccJ \== Jを指定する必要があります。

関連する問題