Установить значение в массиве - Пролог - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть какое-то правило, которое set_value_in_array.Он является значением repalce в массиве [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]?Он всегда возвращает true.

Обновление:

Когда я делаю set_value_in_array ([], Val, 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.

Но как заставить это работать без функции записи?

1 Ответ

1 голос
/ 15 сентября 2011

Основная проблема с вашим кодом заключается в том, что вы неправильно строите результат. Должно быть наоборот:

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

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

Есть также несколько других проблем с кодом. В общем, вы должны тщательно продумать, каковы меньшие случаи, когда вы удаляете первый элемент списка, и каков базовый случай (вы не указываете список результатов там).

Вам также нужно указать это AccJ \== J для второго случая.

...