Пролог: добавление результатов в основной список вместо основных списков - PullRequest
0 голосов
/ 11 мая 2018

Таким образом, у меня есть простой предикат, определенный как

pred(Info, List, Result) :-
  maplist(pred_calculate(Info), List, Result).

pred_calculate, возвращает список элементов X после операции над элементом списка, поэтому, например, pred_calculate(Info, List, Result) будет возвращать что-то вроде [2,3,5]

Я хочу добавить все результаты применения предиката pred_calculate ко всем элементам List, проблема, с которой я сталкиваюсь, заключается в том, что в данный момент он добавляет все результаты из pred_calculate какподсписки вместо добавления только в один основной список.

Так что на данный момент Result возвращает [[2,3,5],[5,7,8],[8,9,11]], когда должно возвращаться только [2,3,5,5,7,8,8,9,11]

Как мне изменить его наисправить это поведение?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

При использовании foldl/4 с append/3 необходимо передать аргументы в правильном порядке, чтобы добавить, если порядок элементов важен 1 :

pred(Info, List, Result) :-
    maplist(pred_calculate(Info), List, List1),
    foldl([A, B, C] >> append(B, A, C), List1, [], Result).

Кроме того, flatten/2 достиг бы того же результата, то есть:

.
pred(Info, List, Result) :-
    maplist(pred_calculate(Info), List, List1),
    flatten(List1, Result).

1 : foldl(append, List1, [], Result) даст вам [8,9,11,5,7,8,2,3,5] в результате.

0 голосов
/ 11 мая 2018

maplist вызывает pred_calculate(Info) для каждого соответствующего элемента List и Result. Возможно, maplist - это не то, что вы действительно хотите использовать здесь, если pred_calculate приводит к списку при каждом вызове, поскольку это не переписка 1-1. У вас есть один ко многим, и вы хотите, чтобы многие были в одном большом плоском списке. Вы можете использовать flatten или fold, как предлагает! Joel76. Или вы можете «вручную» написать свой собственный maplist -подобный предикат, который очень прост - просто базовая рекурсия списка и, возможно, с использованием append для выполнения каждого шага:

pred(Info, List, Result) :-
    pred(Info, List, [], Result).

pred(Info, [], Result, Result).
pred(Info, [H|T], Acc, Result) :-
    pred_calculate(Info, H, R),
    append(Acc, R, Acc1),
    pred(Info, T, Acc1, Result).
...