如果有人能详细说明prolog中is
关键字和=运算符之间的区别,我会很感激。我在== and =中看到了这个讨论,但它排除了is
。该文档谈到了一个不明确的“未绑定的左操作数”。谁能详细说明?
我有以下is
的例子:
age(Person,X) :-
birth_year(Person,Y1),
current_year(Y2),
X is Y2-Y1.
差异分配与比较吗?任何帮助表示赞赏!
编辑:==和is
之间的关系是什么?除非我对上述关系有误解,否则我不会问==和=的关系。
答案 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.
请注意,=/2
和is/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'。只有在不需要评估时才应使用'=',目的是分配值或执行匹配。
希望这会有所帮助。