Ответ в теме: Заменить элемент в списке на Visual Prolog

      Комментарии к записи Ответ в теме: Заменить элемент в списке на Visual Prolog отключены
#2240

replace([], _OldValue, _NewValue, []):-!.
replace([OldValue|Tail], OldValue, NewValue, [NewValue|ReplacedTail]):-
  !, replace(Tail, OldValue, NewValue, ReplacedTail).
replace([Head|Tail], OldValue, NewValue, [Head|ReplacedTail]):-
  replace(Tail, OldValue, NewValue, ReplacedTail).

Если исходный список пуст, то независимо от от значений заменяемых элементов, результатом должен быть пустой список. Поэтому перед именами переменных стоит символ подчеркивания – переменные не используются, поэтому должны быть анонимными, иначе компилятор выдавал бы предупреждения.

Иначе от исходного списка отделяется первый элемент, остальные элементы (Tail) обрабатываются рекурсивно – в результате формируется ReplacedTail, содержащий элементы хвоста, в которых уже произведена замена. К полученному результату необходимо добавить либо значение нового элемента (если первый элемент исходного списка совпал со старым значением), либо значение головы исходного списка.

Вложения: