prolog - 消息:1031 prolog 中的算术溢出
问题描述
谓词
nondeterm s(integer,integer)
nondeterm p(integer,integer,integer)
条款
s(V,R) :-
p(0,V,R).
%,write(R),nl.
p(R,0,R).
p(Inc,V,R) :-
I2=Inc+V,
N1=V-1,
p(I2,N1,R).
目标
s(9,O).
给出算术溢出,,,为什么?
解决方案
在 Prolog 中,数学表达式不是通过赋值完成的,例如=
. Prolog 不像许多常见的编程语言那样使用赋值,Prolog 使用统一。如果你想在 Prolog 中做数学表达式并将结果与变量统一,那么你需要使用 is/2 运算符
I2 is Inc+V
N1 is V-1
如果第二个参数为 0,您还需要一个保护语句来防止执行第二个子句。
s(V,O) :-
p(0,V,O).
p(R,0,R).
p(Inc,V,R) :-
V \= 0,
I2 is Inc+V,
N1 is V-1,
p(I2,N1,R).
现在您的查询返回
?- s(9,O).
O = 45 ;
false.
推荐阅读
- codeigniter - 在具有不同数据库的第一个 codeigniter 中使用相同的 codeigniter 文件会话
- embedded - Bootargs 使用 TFTP 和 QSPI 在 SAMA5D27-SOM1-EK 板上安装 Rootfs
- cakephp - 我的实体文件没有包含在 cakephp 中。有人能帮我吗?
- machine-learning - 构建自己的自定义面部识别的良好做法是什么?
- mysql - Mysql:如何在分区中使用 WHERE 条件
- ajax - 如何将此 Ajax 查询转换为 Angular 8 中的 http 客户端请求?
- javascript - 如何在点击时返回元素的内容?
- javascript - requireJS require 函数有一个没有定义的模块名
- java - 与 Windows Get-NetIPAddress 命令等效的 Java JNA API
- list - 如何获取 SharePoint 列表中的项目