Как правильно перебрать двумерный массив и суммировать все длины элементов? - PullRequest
1 голос
/ 09 мая 2019

Я столкнулся с проблемой при попытке перебрать двумерный массив и суммировать длины всех элементов внутри пролога.

Я попытался перебрать простой одномерный массив, и результат быложидается.Однако возникли трудности, когда я начал писать код для 2D-массива.Вот мой код:

findsum(L):-
    atom_row(L, Sum),
    write(Sum).

atom_row([Head|Tail], Sum) :-
    atom_lengths(Head, Sum),
    atom_row(Tail, Sum).
atom_row([], 0).

atom_lengths([Head|Tail], Sum):-
    atom_chars(Head, CharList),
    length(CharList, ThisLenght),
    atom_lengths(Tail, Temp),
    Sum is Temp + ThisLenght,
    write(ThisLenght).
atom_lengths([], 0).

Например, сумма элементов в массиве [[aaa, bbbb], [ccccc, dddddd]] должна быть равна 18. И вот что я получаю:

?- findsum([[aaa, bbbb], [ccccc, dddddd]]).
436
false.

Вывод происходит из строки write(ThisLength) после каждой итерации.

1 Ответ

2 голосов
/ 09 мая 2019

Обычно это помогает (очень), разбивая проблему на подзадачи simpeler.Мы можем решить эту проблему, например, с помощью следующих трех шагов:

  1. сначала мы объединяем список списков в один одномерный список, например, с append/2;
  2. затем мы сопоставляем каждый атом в этом списке с длиной этого атома, используя предикат atom_length/2
  3. наконец мы суммируем эти значения, например, с помощью sum_list/2.

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

findsum(LL, S) :-
    append(LL, L),
    maplist(<b>atom_length</b>, L, NL),
    sumlist(NL, S).

Поскольку maplist/3 является предикатом, определенным в library(apply), мы, таким образом, неНе нужно реализовывать любые другие предикаты.

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

Например:

?- findsum([[aaa, bbbb], [ccccc, dddddd]], N).
N = 18.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...