appendAll - добавить список ко всем спискам в списке
Я пытаюсь найти способ добавить список ко всем спискам в списке.
Что-то вроде:
appendAll([a,b],[[q,w],[z,x]],X).
X = [[a,b,q,w],[a,b,z,x]].
Я все еще новичок в прологе, и вложенные списки немного сбивают меня с толку.
Я смотрю на это уже несколько часов:
appendAll([], _, []).
appendAll(_, [], []).
appendAll([H1|T1], [H2|T2], X) :-
append(H1,H2,R),
appendAll(T1,[H2|T2],X).
% recurse down to [], and append back up
Любая помощь высоко ценится Спасибо!
1 ответ
В программировании на Прологе сложно привыкнуть и определить реальные шаблоны рекурсии. Во многих случаях лучше не думать непосредственно о рекурсиях, а спросить, может ли здесь работать какая-то простая для всех конструкция.
В этом случае вы хотите установить связь между списком списков и другим списком списков. Оба имеют одинаковую длину, поскольку элементы соответствуют друг другу поэлементно.
appendAll(Prefix, Lists, Prefixedlists) :-
maplist(append(Prefix), Lists, Prefixedlists).
Предикат maplist/3
определяется во многих системах Пролог. Если нет, определите это так в системе, соответствующей ISO:
maplist(_Cont_2, [], []).
maplist(Cont_2, [X|Xs], [Y|Ys]) :-
call(Cont_2, X, Y),
maplist(Cont_2, Xs, Ys).
Вот то же самое, что и простой предикат:
maplist_append(Prefix, [], []).
maplist_append(Prefix, [X|Xs], [Y|Ys]) :-
append(Prefix, X, Y),
maplist_append(Prefix, Xs, Ys).