Подсчитать количество появлений числа в списке - PullRequest
12 голосов
/ 01 февраля 2012

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

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.

это считать одно и то же число несколько раз

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

Ответы [ 3 ]

18 голосов
/ 01 февраля 2012

Вместо фиктивной переменной _ просто используйте другую переменную 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
0 голосов
/ 18 февраля 2018
ocr(X,[],0):- !.
ocr(X,[Element|Rs],V):- X = Element -> ocr(X,Rs,Ocr), V is 1+ Ocr; ocr(X,Rs,V).

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

0 голосов
/ 09 января 2018

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

count(L, E, N) :-
    include(=(E), L, L2), length(L2, N).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...