在SWI-Prolog中duplicate_term / 2和copy_term / 2之间的差异

时间:2017-04-03 21:10:02

标签: swi-prolog

SWI-Prolog中duplicate_term/2copy_term/2之间有什么区别?

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

1 个答案:

答案 0 :(得分: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).

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

例如,如果你不能没有它们,可以考虑使用属性变量作为破坏性修改的更具声明性的替代方案。最不容易出错且最通用的方法通常是始终坚持纯方法。如有必要,请提供干净的声明性接口,并隐藏其背后的杂质。