Prolog setarg/3是什么;额外逻辑“;?

Prolog setarg/3是什么;额外逻辑“;?,prolog,Prolog,SWI prolog文档使用setarg/3: 此谓词可用于术语的破坏性赋值,将其用作额外的逻辑存储箱。始终尽量避免使用setarg/3,因为许多Prolog系统不支持它,因此必须非常小心意外复制和意外不复制术语 我不确定我是否理解,setarg/3的“额外逻辑”是什么?我知道像cuts和findnsols这样的东西是非常合乎逻辑的,因为它们依赖于Prolog使用的搜索顺序的隐式知识,更改一个术语的参数有什么不好呢?很容易看出,使用setarg/3违反了我们从谓词期望的最基本的声明性属性 例如,

SWI prolog文档使用
setarg/3

此谓词可用于术语的破坏性赋值,将其用作额外的逻辑存储箱。始终尽量避免使用setarg/3,因为许多Prolog系统不支持它,因此必须非常小心意外复制和意外不复制术语


我不确定我是否理解,
setarg/3
的“额外逻辑”是什么?我知道像cuts和findnsols这样的东西是非常合乎逻辑的,因为它们依赖于Prolog使用的搜索顺序的隐式知识,更改一个术语的参数有什么不好呢?

很容易看出,使用
setarg/3
违反了我们从谓词期望的最基本的声明性属性

例如,考虑查询:

?- T = f(a), T = f(b). false. ?-T=f(a),T=f(b)。 错。 声明性地说,我们期望添加约束(即目标)最多可以减少,当然永远不会扩展解决方案集。对吧?

对吧

那么,考虑一下:

?- T = f(a), setarg(1, T, b), T = f(b). T = f(b). ?-T=f(a),setarg(1,T,b),T=f(b)。 T=f(b)。 因此,添加约束已使查询通用化:它以前失败,现在(无条件)成功

在日常任务中,这类似于以下情况:

我想点一份甜点。
对不起,我们的甜点卖完了。
好的,那么我想点一份甜点和一杯咖啡 给你:一份甜点和一杯咖啡

当然,大多数人会发现这样的谈话,如果它发生在一个真正的餐厅,是非常不寻常的


因此,
setarg/3
被称为不纯谓词:单调的一阶推理不能应用于它。

谢谢,这是一个很好的解释。