【问题标题】:What is the difference between is and =?is 和 = 有什么区别?
【发布时间】:2013-04-16 11:14:51
【问题描述】:

我已将这些语句输入 prolog 解释器,但对结果感到困惑。他们不应该返回同样的东西吗?真的吗?

1 ?- 7 = 5 + 2.
false.

2 ?- 7 is 5 + 2.
true.

【问题讨论】:

    标签: prolog


    【解决方案1】:

    不,因为=/2 不是 Prolog 中的 assign,而是 unify。统一算法对算术一无所知,只知道结构。所以你可以在 Prolog 中用算术表达式做一些其他语言很难做到的有趣的事情:

    ?- X = 5 + 2.
    X = 5+2.
    

    那里似乎什么也没发生,但实际发生的是 X 被赋予了值“5 + 2”作为一个结构。换一种说法:

    ?- A + B = 5 + 2.
    A = 5,
    B = 2.
    

    甚至:

    ?- X = 5 + 2, X =.. [Op|_]. 
    X = 5+2,
    Op = (+).
    

    最后一个可能对整个列表更有意义:

    ?- X = 5 + 2, X =.. Y.
    X = 5+2,
    Y = [+, 5, 2].
    

    这是非凡的“univ”运算符=../2 的效果,它能够在类似 Lisp 的列表和 Prolog 语法之间进行转换,使您能够以通用方式对结构进行有趣的构造和分解。

    现在,is/2,另一方面,确实了解算术。它将左边的参数与右边的算术简化的结果统一起来。 请注意它只在一个方向上起作用:

    ?- 7 is 5 + 2.
    true.
    
    ?- 5 + 2 is 7.
    false.
    

    你可以说=/2 对结构感兴趣,is/2 对数值相等感兴趣。但这确实意味着教授 Prolog 代数非常容易:

    simplify(X * Y + X * Z, X * (Y + Z)).  % distributive property
    simplify(X, X).
    
    ?- simplify(A * 3 + A * 4, Q).
    Q = A* (3+4)
    

    现在,这并不完美(请注意,我们得到的是 3+4 而不是 7),要让它变得真正聪明,还有很多工作要做:

    ?- simplify(3 * A + 4 * A, Q).
    Q = 3*A+4*A.
    

    但这是另一天的问题。

    简而言之:

    • =/2 触发统一
    • is/2 触发算术评估

    【讨论】:

    • 谢谢你,特别是简而言之!我很好奇你为什么在 = 之后加上 /2 并且在你的答案中?
    • 斜线将谓词的名称与其“arity”(它接受的参数数量)分开。对于像 'is' 和 '=' 这样的中缀运算符,这只会是 2,但对于其他谓词,您可以使用具有不同数量参数的版本的相同名称,因此您需要这个来保持您的 foo/2 直接来自您的foo/3foo/4。这只是一个很好的约定。
    猜你喜欢
    • 1970-01-01
    • 2016-07-25
    • 2011-02-14
    • 2011-04-16
    • 2020-08-16
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多