Подсчитайте количество вхождений числа в списке

Я пишу программу в прологе, которая подсчитывает количество вхождений числа в списке

count([],X,0).
count([X|T],X,Y):- count(T,X,Z), Y is 1+Z.
count([_|T],X,Z):- count(T,X,Z).

и это вывод

?- count([2,23,3,45,23,44,-20],X,Y).
X = 2,
Y = 1 ;
X = 23,
Y = 2 ;
X = 23,
Y = 1 ;
X = 3,
Y = 1 ;
X = 45,
Y = 1 ;
X = 23,
Y = 1 ;
X = 44,
Y = 1 ;
X = -20,
Y = 1 ;
false.

он подсчитывает одно и то же число несколько раз

Любая помощь приветствуется

Ответ 1

Вместо фиктивной переменной _ просто используйте другую переменную X1 и убедитесь, что она не объединяется с X.

count([],X,0).
count([X|T],X,Y):- count(T,X,Z), Y is 1+Z.
count([X1|T],X,Z):- X1\=X,count(T,X,Z).

Однако обратите внимание, что второй аргумент X должен быть инстанцирован. Так, например, count ([2,23,3,45,23,44, -20], 23, C) объединит C с 2. Если вы хотите, чтобы количество для каждого элемента использовало

:- use_module(library(lists)).

count([],X,0).
count([X|T],X,Y):- count(T,X,Z), Y is 1+Z.
count([X1|T],X,Z):- X1\=X,count(T,X,Z).

countall(List,X,C) :-
    sort(List,List1),
    member(X,List1),
    count(List,X,C).

Затем вы получаете

 ?- countall([2,23,3,45,23,44,-20],X,Y).
   X = -20,
   Y = 1 ? ;
   X = 2,
   Y = 1 ? ;
   X = 3,
   Y = 1 ? ;
   X = 23,
   Y = 2 ? ;
   X = 44,
   Y = 1 ? ;
   X = 45,
   Y = 1 ? ;
   no

Ответ 2

Вы также можете использовать предикат include:

count(L, E, N) :-
    include(=(E), L, L2), length(L2, N).

Ответ 3

ocr(X,[],0):- !.
ocr(X,[Element|Rs],V):- X = Element -> ocr(X,Rs,Ocr), V is 1+ Ocr; ocr(X,Rs,V).

Я сделал это так. Это дает вам только один ответ и заканчивается.