Как подсчитать количество элементов в списке? - PullRequest
4 голосов
/ 15 июня 2011

Мне нужно написать небольшую программу на Прологе для подсчета количества вхождений каждого элемента в списке.

numberOfRepetition(input, result)

Например:

numberOfRepetition([a,b,a,d,c,a,b], X)

может быть удовлетворено X=[a/3,b/2,d/1,c/1], потому что a происходит три раза, b происходит 2 раза и c и d один раз.

Ответы [ 3 ]

4 голосов
/ 27 июня 2011

Я не хочу давать вам ответ, поэтому я помогу вам с этим:

% Find the occurrences of given element in list
%
% occurrences([a,b,c,a],a,X).
% -> X = 2.

occurrences([],_,0).
occurrences([X|Y],X,N):- occurrences(Y,X,W),N is W + 1.
occurrences([X|Y],Z,N):- occurrences(Y,Z,N),X\=Z.

В зависимости от ваших усилий и обратной связи, я могу помочь вам получить ваш ответ.

1 голос
/ 14 июня 2015

Проверьте мой ответ на связанный вопрос " Как подсчитать количество вхождений элементов в списке в прологе "!В этом ответе я представляю предикат list_counts/2, который должен соответствовать вашим потребностям.

Пример использования:

:- list_counts([a,b,a,d,c,a,b],Ys).
Ys = [a-3, b-2, d-1, c-1].

Обратите внимание, что этот предикат использует немного другое представление для пар ключ-значениекратность выражения: главный функтор (-)/2 вместо (/)/2.

Если возможно, переключитесь на представление, используя (-)/2 для лучшей совместимости с предикатами стандартной библиотеки (например, keysort/2).

0 голосов
/ 23 декабря 2014

Если вы хотите найти элемент с максимальным количеством вхождений:

occurrences([],_,0).
occurrences([X|Y],X,N):- occurrences(Y,X,W),N is W + 1.
occurrences([X|Y],Z,N):- occurrences(Y,Z,N),X\=Z.

**make_list(Max):-
   findall((Num,Elem),occurrences([d,d,d,a,a,b,c,d,e],Elem,Num),L),
   sort(L,Sorted),
   last(Sorted,(_,Max)).**
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...