【问题标题】:Arithmetic expression in swi-prologswi-prolog 中的算术表达式
【发布时间】:2013-09-12 12:03:47
【问题描述】:

我有以下序言程序:

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

我正在使用适用于 i386 的 SWI-Prolog 5.10.4 版在此程序上运行查询 p(1)。

答案是“假”。

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

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

【问题讨论】:

    标签: prolog arithmetic-expressions


    【解决方案1】:

    如果您希望 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 了解完整的概要。特别是谓词=:=(带有中缀表示法),比较两个表达式是否具有相等的评估,在某些情况下可能很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-23
      • 2015-12-20
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 2011-01-25
      • 2012-03-01
      • 1970-01-01
      相关资源
      最近更新 更多