PROLOG — Изменять элементы в списке

#list #prolog

#Список #пролог

Вопрос:

Мне нужно изменить элементы в списке, у меня есть следующий код:

 change_aux(_,_,[],[]).
change_aux(X,Y,[X|T],[Y|S]):-!,change_aux(X,Y,T,S).
change_aux(X,Y,[Z|T],[Z|S]):-change_aux(X,Y,T,S).

flatten2([], []) :- !.
flatten2([L|Ls], FlatL) :-
    !,
    flatten2(L, NewL),
    flatten2(Ls, NewLs),
    append(NewL, NewLs, FlatL).
flatten2(L, [L]).

change(X,Y,[X1|Y1],[X2,Y2]):-
    flatten([X1|Y1],L),
    change_aux(X,Y,L,[X2|Y2]).
  

Ввод: change(2,5,[1,[2,[3,2],1]],R) .

Печать: R = [1, [5, 3, 5, 1]] .

Но мне нужно, чтобы R был напечатан следующим образом: R = [1,[5,[3,5],1]]

Не могли бы вы мне помочь, пожалуйста?

Ответ №1:

В приведенном выше коде есть некоторые проблемы, как в определении change(X,Y,[X1|Y1],[X2,Y2]):- Я не думаю, что выходной список всегда должен состоять из двух элементов. Кроме того, предикат change_aux нуждается в некоторой доработке, поскольку теперь он просто перемещается по списку, а не создает вложенный выходной список. Вы могли бы попробовать что-то, что рекурсивно создавало бы вложенные уровни списка, например:

 change(_,_,[],[]).
change(X,Y,[H|T],[H|T1]):-  is_list(H),dif(H,X),change(X,Y,T,T1).
change(X,Y,[X|T],[Y|T1]):- change(X,Y,T,T1).
change(X,Y,[H|T],[L|T1]):- is_list(H),change(X,Y,H,L),change(X,Y,T,T1).
  

Обратите внимание, что в приведенном выше предикате нет необходимости использовать flatten/2 предикат, поскольку мы используем вложенные уровни списка ввода для построения списка вывода.

Пример:

 ?- change(2,5,[1,[2,[3,2],1]],R).
R = [1, [5, [3, 5], 1]] ;
false.
  

Комментарии:

1. Идеально! Теперь я понимаю… Спасибо!

2. рад, что помогло!!