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

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

Любые идеи, как я могу исправить свой код?


person Src    schedule 22.12.2015    source источник
comment
Во-первых, вам нужно понять, что как логическое утверждение C = C + 1 не имеет особого смысла.   -  person repeat    schedule 22.12.2015


Ответы (1)


В следующем коде используется clpfd на swi-prolog, так что не ожидайте, что он запустится как есть в visual-prolog:-(
Тем не менее, я надеюсь, что он вам пригодится!

:- use_module(library(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 является положительным,
    то< /em> сделать вывод, что [E|Es] также содержит C0+1 положительных арифметических выражений.

Пример запроса:

?- count_pos([1,2,3,0,-1,-2], C).
   C = 3
;  false.
person repeat    schedule 22.12.2015
comment
Я считаю чрезвычайно ценным, что вы публикуете такие декларативные решения, спасибо! Это может показаться повторяющимся, но, с другой стороны, сравните несколько десятков постов с огромным количеством учебного материала по Прологу, не содержащему ни крупицы таких методов, и из этого посмотрите, сколько еще нужно, чтобы дать первые следы противовес накопившемуся до сих пор мусору! - person mat; 23.12.2015
comment
@мат. Благодарю вас! Я очень ценю это. Всегда сосредотачивайтесь на том, что мы можем сделать... итог: я предлагаю вам решить эту проблему на перспективной основе. dilbert.com/strip/1998-02-09 - person repeat; 23.12.2015
comment
Работает ли это и с tcount/3? - person false; 23.12.2015