SWI-Prolog 中 duplicate_term/2 和 copy_term/2 的区别

Difference between duplicate_term/2 and copy_term/2 in SWI-Prolog

在 SWI-Prolog 中 duplicate_term/2 and copy_term/2 有什么区别?

你能给出他们表现出不同行为的输入吗?

考虑例如:

?- X = f(a),
   copy_term(X, Y),
   setarg(1, X, b).
X = Y, Y = f(b).

相比之下,创建真正的副本 duplicate_term/2:

?- X = f(a),
   duplicate_term(X, Y),
   setarg(1, X, b).
X = f(b),
Y = f(a).

如果这种差异在您的应用程序中存在问题,您的代码可能会通过使用不易出错的结构来改进。

例如,如果您离不开它们,请考虑使用属性变量作为破坏性修改的更具声明性的替代方案。最不容易出错和最通用的方法通常是始终坚持使用纯方法。如有必要,提出干净的声明式界面,并将杂质隐藏在它们后面。