Пролог: применить предикат ко всем элементам списка и суммировать результаты - PullRequest
1 голос
/ 10 ноября 2019

У меня есть определенный список, который генерируется из предиката и выглядит следующим образом:

[a, b, c]

У меня также есть следующий предикат p/3, который можно применить к каждому элементу моего списка:

?- p(a, NewList, Number).

и будет возвращено:

NewList = [c, d],
Number = 2.

, где NewList - это новый сгенерированный список из элемента a , а Number - длина NewList.

Задача :

Я хочу применить предикат p/3 ко всем элементам и получить

  1. один список, состоящий извсе элементы из всех новых списков, то есть все новые списки, добавленные вместе
  2. и сумма всех чисел.

Я пытался сделать это так:

loop_list([Element|[]], NewList, Number) :-
    p(Element, NewList, Number).
loop_list([Head|Tail], [Tmp|NewList], Number) :-
    loop_list(Tail, Tmp, Number).

, ноне удалось.

1 Ответ

0 голосов
/ 10 ноября 2019

Часто лучше разделить ваши проблемы и решить одну задачу одновременно. Вы можете использовать maplist/4 [swi-doc] здесь, чтобы вызвать предикат для всех элементов в списке. Это объединит третий и четвертый элементы с результатами p/3.

. Далее мы можем использовать append/2 [swi-doc] добавлять списки вместе и sumlist/2 [swi-doc] для суммирования элементов списка.

Таким образом, мы можем реализовать это как:

loop_list(Ls, Xs, Sum) :-
    maplist(p, Ls, Xss, Items),
    append(Xss, Xs),
    sumlist(Items, Sum).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...