Пролог: подсчет положительных элементов в списке

Я хочу посчитать положительные элементы в списке (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). 

Давайте читать пункты на простом английском языке в направлении "стрелки":-это "справа налево".

  1. count_pos([], 0).

    Количество положительных арифметических выражений, содержащихся в пустом списке[]это ноль.

  2. count_pos([E|Es], C) :- E #=< 0, count_pos(Es, C).

    Если списокEs содержитCположительные арифметические выражения
    и если какое-то арифметическое выражениеEне является положительным
    затем сделайте вывод, что[E|Es]также содержитCположительные арифметические выражения.

  3. 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.
Другие вопросы по тегам