2012-01-31 37 views
10

Estoy escribiendo un programa en el prólogo que cuente el número de veces que aparece un número en una listaContar el número de apariciones de un número en una lista

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

y esto es la salida

?- 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. 

es contar el mismo número varias veces

Cualquier ayuda se agradece

+1

Consulte ['tcount/3'] (http://stackoverflow.com/a/29960878/772868) para obtener una definición lógicamente pura. – false

Respuesta

14

En lugar del maniquí vari capaces _ sólo tiene que utilizar otra variable X1 y asegurarse de que no unifica con 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). 

Sin embargo, tenga en cuenta que el segundo argumento X se supone que es instanciado. Por ejemplo, count ([2,23,3,45,23,44, -20], 23, C) unificará C con 2. Si desea que el recuento para cada elemento de uso de

:- 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). 

Entonces usted consigue

?- 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

pat fats, muchas gracias, funciona perfectamente – Ratzo

+0

Al menos para mí, si simplemente reemplazo 'Y es 1 + Z' con' succ (Z, Y) ', entonces no necesito el predicado' countall/3' en absoluto para obtener todas las soluciones al retroceder. También debería intentar reemplazar 'X1 \ = X' con' dif (X1, X) '. –

+0

Ver [esta respuesta] (http://stackoverflow.com/a/34738970/1812457) –

0

también puede utilizar el predicado include:

count(L, E, N) :- 
    include(=(E), L, L2), length(L2, N). 
0
ocr(X,[],0):- !. 
ocr(X,[Element|Rs],V):- X = Element -> ocr(X,Rs,Ocr), V is 1+ Ocr; ocr(X,Rs,V). 

lo hice así. Eso te da solo una respuesta y termina.

Cuestiones relacionadas