首页 > 解决方案 > 消息: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 使用统一。如果你想在 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.

推荐阅读