prolog中关键字is和=有什么区别?

时间:2015-10-12 02:10:52

标签: prolog operators keyword

如果有人能详细说明prolog中is关键字和=运算符之间的区别,我会很感激。我在== and =中看到了这个讨论,但它排除了is。该文档谈到了一个不明确的“未绑定的左操作数”。谁能详细说明?

我有以下is的例子:

age(Person,X) :-
birth_year(Person,Y1),
current_year(Y2),
X is Y2-Y1. 

差异分配与比较吗?任何帮助表示赞赏!

编辑:==和is之间的关系是什么?除非我对上述关系有误解,否则我不会问==和=的关系。

2 个答案:

答案 0 :(得分:4)

像往常一样,一点点探索有助于:

?- X = 2 + 1. % unify X with 2 + 1
X = 2+1.

?- X = 2 + 1, write_canonical(X). % how does Prolog see X?
+(2,1)
X = 2+1.

?- is(X, +(2,1)). % evaluate the term +(2,1) as an arithmetic expression
                  % and unify X with the result
X = 3.

关于X作为自由变量的观点是,由于算术表达式的结果与统一,因此即使条件不相同,您也可能会感到惊讶算术表达式似乎应该是:

?- 1+2 is 2+1. % Evaluate 2+1 and try to unify with +(1,2)
false.

?- 1 is (1.5*2)-2. % Evaluates to 1.0 (float), unify with 1 (integer)
false.

?- 1+2 =:= 2+1.
true.

?- 1 =:= (1.5*2)-2.
true.

请注意,=/2is/2都是谓词。它们也可以只是原子,因此它们也可以是仿函数的名称。两者都恰好被声明为运营商。我不认为应该将其称为"关键字"。

答案 1 :(得分:0)

'是'是一个运算符,'='也是如此。但他们的工作不同。只有当RHS中的所有操作数都被实例化(具有它们的就绪值)时,才能评估'是'才能使用(或正常工作)。

例如:

?- X is X+1.

这将导致错误,直到'是'的RHS上的X已经为其分配了一个值(已经实例化)。

但是,以下内容可行:

?- X = 3, X is X+1.

现在X变为4。

另一方面,

'='不会导致或将任何形式的RHS评估分配给LHS。

?- X = 3 + 1.

这将给出'3 + 1'而不是4.记住,'='根本不会导致评估。

?- X is 3+1.

这将给出4.

但是,以下工作原理如下:

?- X = 5, Y = X.

现在,由于不需要评估,Y将变为5。

'='也可用于匹配:

?- likes(john, X) = likes(Y, burger).
X = burger,
Y = john.

以上将是结果。

因此,只有在需要评估并且已经实例化其RHS上的所有操作数时才应使用'is'。只有在不需要评估时才应使用'=',目的是分配值或执行匹配。

希望这会有所帮助。