appendAll - добавить список ко всем спискам в списке - PullRequest
1 голос
/ 19 февраля 2012

Я пытаюсь найти способ добавить список ко всем спискам в списке.

Что-то вроде:

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 Ответ

3 голосов
/ 19 февраля 2012

В программировании на Прологе сложно привыкнуть и определить фактические шаблоны рекурсии.Во многих случаях лучше не думать непосредственно о рекурсиях, а спросить, может ли здесь работать какая-то простая для всех конструкция.

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

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).
...