这是怎么回事?
我在使用 Prolog 时遇到了一些非常奇怪的问题。
在给定索引处替换列表中元素的递归规则并不总是有效。
我的规则如下所示:
% Base rule - Stops when index is 1 and replaces the head with the element.
replaceAtIndex(1, _element, [_|_tail], [_element|_tail]).
% Recursive rule - Enter recursion for tail as long as index is larger than 1.
replaceAtIndex(_index, _element, [_head|_tail], [_head|_new_tail]):-
_index > 1,
_new_index is _index - 1,
replaceAtIndex(_new_index, _element, _tail, _new_tail).
当我在程序中使用调试器时,无论索引是什么,我都会看到它总是调用第二条规则,但是当我在程序外部执行完全相同的命令时,它运行得非常好。它到达索引 1 但调用第二条规则,并且不会回溯并尝试第一条规则并且一直失败......
调用 replaceAtIndex 的规则如下所示:
level_replace_block_value(_x, _y, _value):-
current_level(_level_number, _width, _height, _blocks, _drawX, _drawY),
coordinates_to_index(_x, _y, _index),
_index_in_list is _index + 1, % the replaceAtIndex is not 0 terminated
replaceAtIndex(_index_in_list, _value, _blocks, _new_blocks),
retractall(current_level(_,_,_,_,_,_)),
assert(current_level(_level_number, _width, _height, _new_blocks, _drawX, _drawY),
graphics_update_block_value(_x, _y).
当我调试它的调用时,索引为 111。
当我用_index_in_list
常量 111 替换它时,它可以工作。
任何人都可能知道为什么会发生这种情况?