Prolog:统计列表中正数元素的数量

3
我想在列表(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=C+1。
有什么想法如何修复我的代码吗?

4
首先,你需要认识到作为一个逻辑陈述,C = C + 1并没有太多意义。 - repeat
1个回答

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

    空列表[]中包含的正算术表达式数量为零。

  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.

3
非常感谢您发布这些有力的解决方案,我觉得它们非常有价值!虽然可能会显得有些重复,但与那些没有包含任何这样方法的大量Prolog教材相比,只需数十篇帖子就能产生对比,从中可以看出需要多少努力才能提供首批反制迄今为止积累的垃圾的蛛丝马迹! - mat
@mat。谢谢你!我真的很感激。始终关注我们能做什么...底线是:“我建议你从现在开始解决这个问题。”http://dilbert.com/strip/1998-02-09 - repeat
这个也适用于 tcount/3 吗? - false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接