2011-09-15 6 views
3

Как я могу вычислить длину спискаПролог длина списка

?- 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 = []. 
+1

является то, что в прошлом один правильный? чтобы быть последовательным, это не будет 'size_sub ([[]], X) .' или' size_sub ([], X) 'ответ будет' [] ' –

ответ

6

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). 
+0

Я не знаю, как создать размер/2 – Mary

+0

@Mary ответ обновлен –

7

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

size_sub(Xss,Ls):- 
    maplist(length,Xss,Ls). 
Смежные вопросы