Помощь со списками прологов - PullRequest
0 голосов
/ 28 декабря 2010

Я новичок в Прологе и искал некоторую помощь. Что я пытаюсь сделать, так это получить список из списка, если это имеет смысл? лол

То, чего я пытаюсь достичь, это .... сумма ([[1,2], [3,4], [5,6]]). должен вернуть: Количество списков: 3 Список 1 3 Список 2 7 Список 3 11 .... и т.д.

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

Если кто-нибудь может мне помочь или указать мне общее направление, это было бы замечательно.

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 28 декабря 2010

В SWI-Prolog вы можете использовать maplist и sumlist;

?- maplist(sumlist, [[1,2], [3,4], [5,6]], Lengths).
Lengths = [3, 7, 11].

Теперь вы можете красиво печатать Lengths так, как вам нравится.

Чтобы узнать, какmaplist и sumlist реализованы, просто вызовите listing(maplist) и listing(sumlist).

0 голосов
/ 28 декабря 2010

Если вы хотите ограничить количество используемых вами предикатов только «is»:

sum_list([], []).
sum_list([[A,B]|Rest], [Current|RestResult]) :-
      Current is A + B,
      sum_list(Rest, RestResult).

?- sum_list( [[1,2],[3,4],[5,6]], X ).
X = [3, 7, 11].

Протестировано в SWI-Prolog.

0 голосов
/ 28 декабря 2010

Пока это вопрос для начинающих, я создал следующий код в 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 работают сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...