Как я могу вычислить длину спискаПролог длина списка
?- 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 = [].
Как я могу вычислить длину спискаПролог длина списка
?- 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 = [].
Ok Вы должны начать с базовым случаем, который является последним ответом
так size_sub([],X).
верно, если X=[]
так первым вы пишете это, как правило.
size_sub([],[]).
Затем вам нужно сделать индуктивный шаг, который длиннее предыдущего. Я предполагаю, что у вас есть функция size/2 для определения размера одного списка (если не прокомментировать).
Таким образом, индуктивный шаг будет работать по длине первого параметра, поэтому N-> N + 1. Мы представим это, разделив головку синтаксиса списка на [H|T]
. Теперь второй параметр (ваш ответ) будет длиной H с результатом вызова size_sub на T. Поскольку мы не можем указывать правила в параметрах в заголовок мы будем использовать N представлять длину Н и Т2 представляют собой результат size_sub на Т.
Таким образом, первая часть правила становится 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).
размера/2 является гораздо более простым случаем и после того же процесса базы + индуктивным вы должны быть в состоянии создать правила для него. Прошу прокомментировать, если вам нужна дополнительная помощь.
** 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).
Я не знаю, как создать размер/2 – Mary
@Mary ответ обновлен –
Чтобы отобразить length/2
над списком списков, мы можем использовать meta-predicatemaplist/3
так:
size_sub(Xss,Ls):-
maplist(length,Xss,Ls).
является то, что в прошлом один правильный? чтобы быть последовательным, это не будет 'size_sub ([[]], X) .' или' size_sub ([], X) 'ответ будет' [] ' –