2017-01-16 2 views
0

Ich habe ein Problem mit der Berechnung der Vorkommen der angegebenen Nummer in der Liste. Zum Beispiel, wenn wir eine Liste wie L = [4,5,6,4,3,4,2,4,5,6,7,4] haben und ich möchte zählen, wie viele 4 s ist in der Liste, dann ist die Antwort 5.Zählnummern in der Liste

Ich habe versucht, dies in Prolog zu implementieren, aber gprolog zeigt mir nur no als Antwort:

count_occ([], 0). 
count_occ([H|T], L) :- count_occ(T, N), H =:= 4, L is N + 1. 

Und ich weiß nicht, warum.

+1

Überlegen Sie, was passiert, wenn 'H' nicht 4. – Alexander

+0

@Alexander ist: Ich änderte die zweite Zeile zu 'count_oss ([H | T], L): - count_occ (T, N), (H =: = 4, L ist N + 1), (H = \ = 4, L ist N + 0) .' und keine Erfolge. – mirx

+0

Das bedeutet, dass H ist gleich 4, ** und ** nicht gleich 4, was eindeutig ein Widerspruch ist. Ich denke, du musst 3 Prädikate haben. Das Basisprädikat, eins für wenn H 4 ist, und eins für wenn H nicht 4 – Alexander

Antwort

2

ich glaube, das Problem ist, dass Sie dies nicht tun stellen Sie eine Klausel bereit, die Prolog nehmen kann, wenn H nicht 4 ist. Dieser ist jedoch einfach: Sie einfach einen rekursiven Aufruf ausführen:

count_occ([H|T],N) :- 
    H \= 4, 
    count_occ(T,N). 

Oder eine vollständige Umsetzung:

count_occ([],0). 
count_occ([4|T],N1) :- 
    count_occ(T,N), 
    N1 is N+1. 
count_occ([H|T],N) :- 
    H \= 4, 
    count_occ(T,N). 
3

Ich habe einen Stich gemacht. Ich habe es zusätzliche ausführliche so ist es einfach zu folgen:

% count_occurences(+List, +DesiredElement, -NumOccurences) 

count_occurences([], _, 0). 

count_occurences([H|T], DesiredElement, NumOccurences) :- 
    H =\= DesiredElement, 
    count_occurences(T, DesiredElement, NumOccurences). 

count_occurences([H|T], DesiredElement, NumOccurences) :- 
    H =:= DesiredElement, 
    count_occurences(T, DesiredElement, N), 
    NumOccurences is N + 1. 

Mit einem bedingten Ausdruck, die letzten zwei Prädikate zu einem zusammengefasst werden können:

% count_occurences(+List, +DesiredElement, -NumOccurences) 

count_occurences([], _, 0). 

count_occurences([H|T], DesiredElement, NumOccurences) :- 
    count_occurences(T, DesiredElement, N), 
    (H =:= DesiredElement ->  /* if H is DesiredElement */ 
     NumOccurences is N + 1; /* "then" */ 
     NumOccurences is N  /* "else" */ 
    ). 
+0

Ihre erste Prädikatsklausel kann einfach sein, 'count_occurences ([], 0, _).' – lurker

+0

@lurker: Ich denke, dass Alexander so explizit wie möglich darauf abzielt, dass das OP dem Programm auch dann folgen kann, wenn er weiß nicht über die Vereinigung im Kopf. –

+0

@lurker Ich setze absichtlich Variablennamen ein, um zu dokumentieren, was jeder der Parameter ist. – Alexander

Verwandte Themen