Что?
У меня возникли некоторые странные проблемы с 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).
When Я отлаживаю его вызов с индексом 111.
Когда я заменяю _index_in_list
константой 111, он работает.
Любой может иметь ключ к пониманию, почему это происходит?
Можете ли вы нас вызвать 'replaceAtIndex', который действительно ведет себя так, как вы описываете? В идеале без использования 'level_replace_block_value'. Может быть, проблема в том, что две ссылки на '_tail' (или' _element') не могут быть объединены? – svick
Хорошо, я отследил его в отладчике, чтобы индексировать его. Упс всего лишь секунду ... – YLivay
Хорошо, я отследил его в отладчике до индекса 3. Вот как это выглядит: http: // paste.ubuntu.com/835140/. Когда я называю это вне моей программы, это выглядит так: http://paste.ubuntu.com/835141/, и отладка выглядит следующим образом: http://paste.ubuntu.com/835145/ – YLivay