Хорошо, вам нужно начать с базового варианта, который является последним ответом
поэтому 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).