Пролог: подсчет положительных элементов в списке
Я хочу посчитать положительные элементы в списке (VIsual Prolog). Итак, я написал эту функцию:
positiveCount([], C).
positiveCount([A], C) :- A > 0, C = C + 1.
positiveCount([H|T], C) :- H > 0,!,C = C+1,positiveCount(T,C); positiveCount(T,C).
Ошибка:
The flow pattern '(o,i)' does not exist for '+' main.pro
Как я понял из этой ошибки, я не могу использовать C=C+1
для C в качестве входной переменной.
Любые идеи, как я могу исправить свой код?
1 ответ
Следующий код использует clpfd на swi -prolog, поэтому не ожидайте, что он будет работать как есть на /questions/tagged/visual-prolog:-(
Тем не менее, я надеюсь, что это полезно для вас!
: - use_module( библиотека (clpfd)). count_pos ([], 0). count_pos ([E | Es], C): - E # = <;; 0, count_pos (Es, C). count_pos ([E | Es], C): - E #>;; 0, C # = C0 + 1, count_pos (Es, C0).
Давайте читать пункты на простом английском языке в направлении "стрелки":-
это "справа налево".
count_pos([], 0).
Количество положительных арифметических выражений, содержащихся в пустом списке
[]
это ноль.count_pos([E|Es], C) :- E #=< 0, count_pos(Es, C).
Если список
Es
содержитC
положительные арифметические выражения
и если какое-то арифметическое выражениеE
не является положительным
затем сделайте вывод, что[E|Es]
также содержитC
положительные арифметические выражения.count_pos([E|Es], C) :- E #> 0, C #= C0+1, count_pos(Es, C0).
Если список
Es
содержитC0
положительные арифметические выражения
и если какое-то арифметическое выражениеE
положительно
затем сделайте вывод, что[E|Es]
также содержитC0+1
положительные арифметические выражения.
Пример запроса:
?- count_pos([1,2,3,0,-1,-2], C).
C = 3
; false.