Ich möchte die Anzahl der Elemente in einer Liste zählen, die eine Beziehung mit dem folgenden Element haben. Das Prädikat I funktioniert, indem es eine Akkumulatorvariable verwendet, die es erhöht, wenn das Prädikat related true zurückgibt. Der folgende Beispielcode überprüft, wie oft ein Element größer als sein vorheriges Element ist.Liste - Atome zählen, die zu ihrem vorherigen Ausdruck gehören
So zum Beispiel
count_list([1,2,3,2,1,3,2],Count).
sollte zurückkehren 3.
Der Code fast funktioniert. Es erhöht die Akkumulatorvariable korrekt. Die Funktion gibt jedoch false zurück, wenn sie versucht, die letzte 2 am Ende mit der nicht vorhandenen nächsten zu vergleichen.
listofitems([],N,N).
%count number of items which are related to the previous
listofitems([A,B|T],Acc,N) :-
write(A),write(' '), write(B),
(related(A,B) -> Acc1 is Acc+1 ; Acc1 = Acc),
write(Acc1),write('\n'),
listofitems([B|T],Acc1,N).
count_list(L,N):-
listofitems(L,0,N).
%define the relationship to be counted
related(A,B):-
B>A.
Hat jemand irgendwelche Vorschläge, wie man eine elegante Beendigungsbedingung erstellt, damit ich den akkumulierten Wert zurückgeben kann?
Warnung: maplist/4 in der aktuellen SICStus nicht monoton ist! – false