Ответ 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