swi-prolog中的算术表达式

时间:2013-09-09 02:37:48

标签: prolog arithmetic-expressions

我有以下prolog程序:

set_1(2).
p(X) :- set_1(X+1).

我正在使用SWI-Prolog版本5.10.4 for i386在该程序上运行查询p(1)。

答案是“假的”。

我希望答案为'true',因为set_1(X + 1)应该以set_1(2)为基础并用第一个事实解决。

为什么答案是假的,我怎么能得到'真'?

1 个答案:

答案 0 :(得分:2)

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

单独X+1是一个有效的Prolog术语,但即使X1统一,该术语也会成为1+1,而不是2你预期

尝试改为:

p(X) :- Y is X+1, set_1(Y).

已添加:值得指出的是,Prolog在评估算术表达式时的极端“懒惰”使我们能够将评估责任从p/1推迟到set_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。有关完整的纲要,请参阅here。特别是谓词=:=(使用中缀表示法),比较两个表达式是否具有相同的评估,在某些情况下可能会有用。

相关问题