Пролог длина списка - PullRequest
       22

Пролог длина списка

3 голосов
/ 15 сентября 2011

Как рассчитать длину списка

?- size_sub([[b,a,g], [9,3,7,4], [6]],  X).
X = [3, 4, 1].

?- size_sub([[c,g,e,w], [7]],  X).
X = [4, 1].

?- size_sub([],  X).
X = [].

Ответы [ 2 ]

7 голосов
/ 16 сентября 2011

Чтобы отобразить length/2 по списку списков, мы можем использовать мета-предикат maplist/3, например:

size_sub(Xss,Ls):-
    maplist(length,Xss,Ls).
6 голосов
/ 16 сентября 2011

Хорошо, вам нужно начать с базового варианта, который является последним ответом

поэтому size_sub([],X). - это истина, если X=[], поэтому сначала вы пишете это, как правило.

size_sub([],[]).

Тогда вам нужно сделать индуктивный шаг, список которого длиннее предыдущего. Я предполагаю, что у вас есть функция size / 2 для определения размера одного списка (если нет, пожалуйста, прокомментируйте).

Таким образом, индуктивный шаг будет действовать на длину первого параметра, так что N-> N + 1. Мы представили бы это, убрав заголовок списка, синтаксис которого будет [H|T], теперь второй параметр (ваш ответ) будет иметь длину H с результатом вызова size_sub для T. Поскольку мы не можем указать правила в Параметры в заголовке мы будем использовать N для представления длины H и T2 для представления результата size_sub на T.

Итак, первая часть правила становится size_sub([H|T],[N|T2]):-

теперь мы следуем за ним с предикатами, которые будут утверждать значения для N и T2.

size(H,N),
size_sub(T,T2).

сложив все вместе, вы получите

size_sub([],[]).

size_sub([H|T],[N|T2]):-
    size(H,N),
    size_sub(T,T2).

size / 2 - гораздо более простой случай, и, следуя тому же процессу base + индуктивный, вы сможете создать правила для него. Пожалуйста, прокомментируйте, если вам нужна дополнительная помощь.

** EDIT - Запрос размера / 2 определения **

Определить размер / 2

Начните с базового варианта, пустой список имеет размер 0.

size([],0).

Теперь индуктивный шаг. Размер списка длины (N + 1) - это размер списка длины (N). Итак, давайте определим наш список как [_|T] Я определил список, используя _ для представления заголовка, потому что мы никогда не используем его, поэтому мы можем просто использовать анонимную переменную. Позволяет использовать N для обозначения длины T и M для N + 1.

так

размер ([_ | T], М): -

теперь давайте определим N

  size(T,N),

и, наконец, утверждают, что М равен N + 1

  M is N+1.

так что все собираем вместе

size([],0).

size([_|T],N):-
    size(T,M),
    N is M+1.

size_sub([],[]).

size_sub([H|T],[N|T2]):-
    size(H,N),
    size_sub(T,T2).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...