Я пытаюсь добиться этого:Заменить один или несколько элементов в списке вложенного
Учитывая OldList
, заменить любой элемент, если элемент выполняет задачу (oldNew)
; если нет, не заменяйте элемент.
Возврат NewList
с замененными элементами, имеющими ту же структуру (то же самое вложенность), что и OldList
.
Я получаю его на работу (см. Мой код) для специального случая OldList = [a, b, c]
, но я хотел бы написать предикат, который обобщает длину списка и вложенные списки, например. также для OldList = [a, [b, c, [d, e]]]
.
Заранее благодарен! /JC
oldNew(fruit, banana).
oldNew(car, ferrari).
replace(OldList, NewList):-
[X1, X2, X3] = OldList,
(oldNew(X1, Y1); Y1 = X1),
(oldNew(X2, Y2); Y2 = X2),
(oldNew(X3, Y3); Y3 = X3),
(oldNew(X1, Y1); oldNew(X2, Y2), oldNew(X3, Y3)),
NewList = [Y1, Y2, Y3].
EDIT1:
Понял работать с произвольными длинами списка; но я до сих пор не знаю, как обрабатывать вложенные списки.
replace2(OldList, NewList):-
[H | T] = OldList,
oldNew(H, NewHead),
NewList = [NewHead | T].
replace2(OldList, NewList):-
[H | T] = OldList,
replace2(T, NewTail),
NewList = [H | NewTail].
Приятное использование 'apply' и' yall'. –
Спасибо CapelliC, это решило мою проблему. – JCR