Пока это вопрос для начинающих, я создал следующий код в Visual Prolog, хотя он является общим и должен работать на всех основных реализациях Prolog:
domains
ilist=integer*
ilistlist=ilist*
predicates
mapsum(ilistlist, ilist, ilist)
reverse(ilist,ilist,ilist)
sum(ilist,integer,integer)
clauses
reverse([],L,L).
reverse([X|Xs], A, R):-
A1 = [X|A],
reverse(Xs, A1, R).
sum([], A, A).
sum([X|Xs], A, R):-
Y = X + A,
sum(XS, Y, R).
mapsum([], A, R):-
reverse(A, [], R).
mapsum([X|Xs], A, R):-
sum(X, 0, Sum),
A1 = [Sum|A],
mapsum(Xs, A1, R).
goal
mapsum([[9,5,3,6],[8,4],[2,7],[]], [], R).
Результат:
R=[23,12,9,0]
1 Solution
Этот код работает для любого количества элементов во внутренних списках и правильно обрабатывает пустые списки.
Я думаю, что не имеет смысла иметь списки внутри списка, подойдет только список сумм.
Звездочка в integer*
в Visual Prolog означает, что вам нужен список integer
s.
В качестве цели вы называете основной предикат mapsum
, предоставляя ему 3 списка в списке, пустой список (аккумулятор) и несвязанную переменную R
; последний получит результат.
mapsum
в каждой итерации извлекает заголовок X
списка, который вы указали в цели, и оценивает сумму его (list) элементов, затем создает новый список A1
, который является комбинацией аккумулятора A
и сумму головы, которую вы только что оценили, затем она вызывает себя с остальными элементами списка (tail), новым накопителем A1
и еще не связанной переменной R
.
Когда mapsum
приближается к связанному условию, когда список (первый аргумент) пуст, он переворачивает список и связывает результат обращения с несвязанной переменной R
.
Думаю, вы разберетесь, как sum
и reverse
работают сами.