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 不将 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 \== J为第二种情况指定。

于 2011-09-15T19:39:25.037 回答