那么setarg/3是"超逻辑"的呢?

num*_*um1 3 prolog

SWI-prolog文档强烈建议不要使用setarg/3:

该谓词可用于对术语的破坏性分配,将它们用作逻辑外存储仓.总是尽量避免使用setarg/3,因为许多Prolog系统都不支持它,并且必须非常小心意外复制以及意外的非复制术语.

我不确定我理解什么是"超逻辑"的setarg/3?我理解cut和findnsols之类的东西是非逻辑性的,因为它们依赖于Prolog使用的搜索顺序的隐含知识,更改术语的参数有什么不好?

mat*_*mat 6

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

例如,考虑查询:

?- T = f(a), T = f(b).
false.

在声明中,我们期望添加约束(即目标)最多可以减少,当然也不会扩展解决方案集.对?

对??

好吧,考虑一下:

?- T = f(a), setarg(1, T, b), T = f(b).
T = f(b).

因此,添加约束已经泛化了查询:它先前失败了,现在成功(无条件).

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

A:我想订一份甜点.
B:对不起,我们没有甜点.
A:好的,那我想订一份甜点和一杯咖啡.
B:给你的是:甜点和咖啡.

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

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

  • 谢谢,这是一个很好的解释. (2认同)