1

我有以下序言程序:

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

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

答案是“假的”。

我希望答案是“真”,因为 set_1(X+1) 应该以 set_1(2) 为基础,并通过第一个事实来解决。

为什么答案是错误的,我怎样才能得到“真”?

4

1 回答 1

2

如果您想X+1在示例中与 2 统一,则需要使用is/2.

其本身X+1是一个有效的 Prolog 术语,但即使X与 统一1,该术语也会变成1+1,而不是2您所期望的。

请尝试:

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

补充:可能值得指出的是,Prolog 在评估算术表达式时的极端“懒惰”允许我们将评估的责任从p/1into推到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.

Predicateis/2并不是唯一一个强制算术表达式求值的内置 SWI-Prolog。有关完整的概要,请参见此处。特别是谓词=:=(使用中缀表示法),比较两个表达式是否具有相同的评估,在某些情况下可能很有用。

于 2013-09-09T02:41:28.997 回答