序言中的关键字 is 和 = 有什么区别?
What is the difference between the keyword is and = in prolog?
如果有人能详细说明序言中 is
关键字和 = 运算符之间的区别,我将不胜感激。我在 == and = 中看到了这个讨论,但它排除了 is
。文档谈到了一个我不清楚的问题 "unbound left operand." 任何人都可以详细说明吗?
我有一个 is
的例子:
age(Person,X) :-
birth_year(Person,Y1),
current_year(Y2),
X is Y2-Y1.
区别是赋值还是比较?任何帮助表示赞赏!
编辑:== 和 is
之间有什么关系?我不是问==和=的关系,除非我对上述关系有误解。
像往常一样,四处看看会有帮助:
?- 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
都是 谓词 。它们也可以只是原子,所以它们也可以是仿函数的名称。两者都恰好被声明为运算符。我认为两者都不应该被称为 "keyword".
'is'是运算符,'='也是。但他们的工作方式不同。 'is' 仅当可以评估其 RHS 时才应使用(或正确工作),前提是 'is' 的 RHS 上的所有操作都已实例化(具有现成的值)。
例如:
?- X is X+1.
这将给出错误,直到 'is' 的 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.
以上就是结果。
因此,'is' 仅应在需要评估且其 RHS 上的所有操作数均已实例化时使用。 '=' 只应在不需要计算且目的是赋值或执行匹配时使用。
希望这对您有所帮助。
如果有人能详细说明序言中 is
关键字和 = 运算符之间的区别,我将不胜感激。我在 == and = 中看到了这个讨论,但它排除了 is
。文档谈到了一个我不清楚的问题 "unbound left operand." 任何人都可以详细说明吗?
我有一个 is
的例子:
age(Person,X) :-
birth_year(Person,Y1),
current_year(Y2),
X is Y2-Y1.
区别是赋值还是比较?任何帮助表示赞赏!
编辑:== 和 is
之间有什么关系?我不是问==和=的关系,除非我对上述关系有误解。
像往常一样,四处看看会有帮助:
?- 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
都是 谓词 。它们也可以只是原子,所以它们也可以是仿函数的名称。两者都恰好被声明为运算符。我认为两者都不应该被称为 "keyword".
'is'是运算符,'='也是。但他们的工作方式不同。 'is' 仅当可以评估其 RHS 时才应使用(或正确工作),前提是 'is' 的 RHS 上的所有操作都已实例化(具有现成的值)。
例如:
?- X is X+1.
这将给出错误,直到 'is' 的 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.
以上就是结果。
因此,'is' 仅应在需要评估且其 RHS 上的所有操作数均已实例化时使用。 '=' 只应在不需要计算且目的是赋值或执行匹配时使用。
希望这对您有所帮助。