SWI-Prolog中duplicate_term/2和copy_term/2之间有什么区别?
你能给出一个他们表现出不同行为的输入吗?
答案 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).
如果这种差异在您的应用程序中存在问题,那么可能会使用纯结构来改进您的代码,而这些结构不易出错。
例如,如果你不能没有它们,可以考虑使用属性变量作为破坏性修改的更具声明性的替代方案。最不容易出错且最通用的方法通常是始终坚持纯方法。如有必要,请提供干净的声明性接口,并隐藏其背后的杂质。