根据我大学的逻辑课程,对于以下查询,我们可以预期得到与 Prolog 定义不同的结果:
append([], a, X)
(统一为X=a
).
但我不明白他们的目的是什么?考虑到附加应该统一 X(在本例中)的串联,应该期望什么作为有效响应[]
and a
?
我认为他们可能期望回报false
or [a]
;但是我认为这应该是连接的结果a
and []
, not []
and a
(since []
是尾部[a]
).
这里的重点是我们期望append/3
持有only for lists.
在您显示的查询中,a
is not一份清单,还没有append/3
still holds.
因此,关系实际上是更一般超出我们最初的预期:它也适用于其他情况!
之所以会这样,可以从传统定义的第一个子句看出append/3
:
append([], Bs, Bs).
仅此一条已经进行查询succeed!没有任何额外的 pure 子句可以阻止这种情况。因此,必须是这个条款受限制的如果我们希望这种关系成立only对于列表。这意味着,我们必须放置一个约束对于第二个参数,我们通过在子句正文中进行说明来实现:
append([], Bs, Bs) :- ... (left as an exercise)
这显然是有代价的:性能。
因此,这里需要在性能和精度之间进行权衡。在 Prolog 中,我们经常接受这样的权衡,因为我们隐式地使用这样的谓词only与预期的条款。另一方面,对于许多谓词,我们希望受益于域名错误 or 输入错误如果未使用预期类型调用它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)