swi-prolog中的算术表达式

swi-prolog中的算术表达式,prolog,arithmetic-expressions,Prolog,Arithmetic Expressions,我有以下prolog程序: set_1(2). p(X) :- set_1(X+1). 我正在使用针对i386的SWI Prolog 5.10.4版在这个程序上运行查询p(1) 答案是“错” 我希望答案是“真的”,因为集合_1(X+1)应该作为集合_1(2)接地,并用第一个事实解决 为什么答案为假,我如何才能得到“真”?如果您希望在示例中X+1与2统一,则需要使用is/2对其进行编码 就其本身而言,X+1是一个有效的序言术语,但即使将X与1统一,术语也会变成1+1,而不是您所期望的2 请尝试:

我有以下prolog程序:

set_1(2).
p(X) :- set_1(X+1).
我正在使用针对i386的SWI Prolog 5.10.4版在这个程序上运行查询p(1)

答案是“错”

我希望答案是“真的”,因为集合_1(X+1)应该作为集合_1(2)接地,并用第一个事实解决


为什么答案为假,我如何才能得到“真”?

如果您希望在示例中
X+1
与2统一,则需要使用
is/2
对其进行编码

就其本身而言,
X+1
是一个有效的序言术语,但即使将
X
1
统一,术语也会变成
1+1
,而不是您所期望的
2

请尝试:

p(X) :- Y is X+1, set_1(Y).
补充道:可能值得指出的是,Prolog在计算算术表达式时的极端“惰性”允许我们将计算责任从
p/1
推到
set\u 1/1
,而代价是必须使该谓词成为一个规则,而不是一个简单的事实

1 ?- [user].
|: set_1(X) :- 2 is X.
|: p(X) :- set_1(X+1).
|: {Ctrl-D}
% user://1 compiled 0.00 sec, 3 clauses
true.

2 ?- p(1).
true.
谓词
is/2
并不是唯一强制算术表达式求值的内置SWI Prolog。有关完整的详细信息,请参阅。特别是谓词
=:=
(带中缀符号),比较两个表达式的求值是否相等,在某些情况下可能有用