list - 列表中的 Prolog-Sum 正数
问题描述
我有以下 Prolog 事实来总结列表中的正数,但它不起作用。我究竟做错了什么?
somarPositivos([],0).
somarPositivos([H|T],Soma):-H>0,somarPositivos(T,Soma1),Soma is Soma1+H.
somarPositivos([H|T],Soma):-H=<0 ,somarPositivos(T,Soma1).
解决方案
您在第三个子句中有错字。它应该是:
somarPositivos([H|T],Soma):-H=<0 ,somarPositivos(T,Soma).
大多数 Prolog 编译器会在该子句中打印出变量Soma
和Soma1
是单例变量的警告。
关于遵循 Prolog 编码指南的编程风格的一些注释。缩进你的代码。在运算符周围使用空格。使用下划线而不是 camelCase 作为谓词名称以提高可读性。因此,最好写:
somar_positivos([],0).
somar_positivos([H|T],Soma) :-
H > 0,
somar_positivos(T,Soma1),
Soma is Soma1+H.
somar_positivos([H|T],Soma) :-
H =< 0,
somar_positivos(T,Soma).
作为对这个谓词初始版本的改进,你可以重写它以使用累加器使其尾递归吗?
推荐阅读
- python - Matplotlib - 将标签移动到饼图的中间
- bootstrap-4 - 如何添加以证明 Bootstrap 4 导航的合理性
- node.js - 通过 ssh 在专用服务器上安装 node.js
- php - PHP 错误 - BASE_URL - 用户名 - CodeIgniter
- javascript - 数组中日期的最小值/最大值
- node.js - 无法让 VSCode 调试与我的 NodeJs 应用程序一起使用
- javascript - 如果我选择其他 React Router 会改变状态?
- android - 如何每秒刷新一次视图
- excel - Excel - 批量删除相同的单词和不同括号内容的其余部分
- c# - 使用“禁止”列表禁止列表中的变量