Переменная соответствует члену , и переменная anonimus не является исключением.Список - это просто синтаксический сахар для бинарного отношения между головой и хвостом.Таким образом, переменная может соответствовать списку, голове или хвосту, но не является неопределенной последовательностью.
Некоторые примечания, которые, я надеюсь, помогут вам:
listcount (L, N): - listcountA (LS, [], N).
В Прологе предикаты идентифицируются по имени и num.of.arguments, так называемый функтор и Арити .Поэтому обычно предикаты 'service' с добавленными аргументами сохраняют одно и то же имя.
listcountA ([X | Tail], [? [X, B],?], N): - B - B +1, listcountA (Tail, [? [X, B]?], N).
B означает, что B + 1 никогда не будет успешным, вы должны использовать новую переменную.И нет никакого способа сопоставить внутри списка, используя «подстановочный знак», как вы, кажется, делаете.Вместо этого напишите предикат для поиска и обновления счетчика.
Последнее замечание: обычно пары элементов обозначаются с помощью бинарного отношения, обычно некоторого (произвольного) оператора.Например, чаще всего используется тире.
Поэтому я бы написал, что
listcount(L, Counters) :-
listcount(L, [], Counters).
listcount([X | Tail], Counted, Counters) :-
update(X, Counted, Updated),
!, listcount(Tail, Updated, Counters).
listcount([], Counters, Counters).
update(X, [X - C | R], [X - S | R]) :-
S is C + 1.
update(X, [H | T], [H | R]) :-
update(X, T, R).
update(X, [], [X - 1]). % X just inserted
update / 3 можно упростить, используя некоторый предикат библиотеки, «перемещающийся внутрь» рекурсии.Например, используя select / 3:
listcount([X | Tail], Counted, Counters) :-
( select(X - C, Counted, Without)
-> S is C + 1
; S = 1, Without = Counted
),
listcount(Tail, [X - S | Without], Counters).
listcount([], Counters, Counters).