2012-01-31 19 views
10

Piszę program w Prologu że policzyć liczbę wystąpień numeru na liściePoliczyć liczbę wystąpień numeru na liście

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

i to jest wyjście

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

to liczyć ten sam numer kilkakrotnie

Każda pomoc jest mile widziana

+1

Zobacz ['tcount/3'] (http://stackoverflow.com/a/29960878/772868) dla logicznie czystej definicji. – false

Odpowiedz

14

Zamiast manekina Vari _ po prostu w stanie użyć innej zmiennej X1 i upewnić się, że nie ma ujednolicić z 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). 

jednak pamiętać, że drugi argument X ma być instancja. Np. count ([2,23,3,45,23,44, -20], 23, C) będzie ujednolicenie C z 2. Jeśli chcesz licznik dla każdego elementu użyć

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

Wtedy masz

?- 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 tłuszcze, wielkie dzięki, działa idealnie – Ratzo

+0

Przynajmniej dla mnie, jeśli po prostu zamieniam 'Y jest 1 + Z' na' succ (Z, Y) ', to nie potrzebuję predykatu' countall/3' w ogóle, aby wszystkie rozwiązania zostały wycofane. Powinieneś także spróbować zastąpić 'X1 \ = X' przez' dif (X1, X) '. –

+0

Zobacz [tę odpowiedź] (http://stackoverflow.com/a/34738970/1812457) –

0

można również użyć include predykat:

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

zrobiłem to tak. To daje tylko jedną odpowiedź i kończy się.

Powiązane problemy