2015-12-22 3 views
2

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

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

+4

Во-первых, вам нужно понять, что, как логическое утверждение, 'C = C + 1' не имеет большого смысла. – repeat

ответ

3

Следующий код использует на , поэтому не следует ожидать, что для запуска как есть на :-(
Тем не менее я надеюсь, что это вам полезен!

 
:- 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).

    The number of positive arithmetic expressions contained in the empty list [] is zero.

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

    If list Es contains C positive arithmetic expressions
    and if some arithmetic expression E is not positive
    then conclude that [E|Es] also contains C positive arithmetic expressions.

  3. count_pos([E|Es], C) :- E #> 0, C#= C0+1, count_pos(Es, C0).

    If list Es contains C0 positive arithmetic expressions
    and if some arithmetic expression Eis positive
    then conclude that [E|Es] also contains C0+1 positive arithmetic expressions.

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

?- count_pos([1,2,3,0,-1,-2], C). 
    C = 3 
; false. 
+3

Я считаю чрезвычайно ценным то, что вы публикуете такие декларативные решения, спасибо! Это может показаться повторяющимся, но, с другой стороны, сопоставить несколько десятков сообщений с огромным количеством учебных материалов Prolog, которые не содержат ни одного зерна таких методов, и из этого видно, сколько еще потребуется для обеспечения первых следов противовес доработанному мусору до сих пор! – mat

+0

@mat. Спасибо! Я очень ценю это. Всегда сосредотачивайтесь на том, что мы можем сделать ... нижняя строка: «Я предлагаю вам разобраться с проблемой на постоянной основе». http://dilbert.com/strip/1998-02-09 – repeat

+0

Работает ли это с ['tcount/3'] (http://stackoverflow.com/a/29960878/772868)? – false

Смежные вопросы