Подсчет количества элементов в списке без учета смежных дубликатов - PullRequest
0 голосов
/ 03 марта 2019
count([], 0).

count([H,H1|T], N) :- (H == H1,
                  count([H1|T], N));

                  (N1 is N-1,
                  count([H1|T], N1)).   

Моя интуиция заключается в том, что первое «если» просто перемещается к «следующей голове», и N не уменьшается, если соседний элемент одинаков, но второе уменьшается, если они разные.Затем, когда список опустошается, это правда.

Возможно, я немного неправильно понимаю, что такое откат в Прологе, но разве это не должно дать правильный ответ?

Я получаю эту ошибку, например:

?- count([3,4,5,6],C).
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR:    [8] count([3,4|...],_972)
ERROR:    [7] <user>

1 Ответ

0 голосов
/ 03 марта 2019

N1 is N-1 означает, что N должно быть числом.но вы звоните count([3,4,5,6],C) с необъявленным C в этой позиции.

Становится N, а затем is терпит неудачу, потому что он еще не создан.

Почемувы все равно вычитаете?Чтобы подсчитать вхождения, вы должны добавить 1 к рекурсивно найденному количеству, а не вычитать при обнаружении такого вхождения.

Или вообще забудьте о is, переключитесь на ограничения и используйте #=.Подробнее см. .

...