gpt4 book ai didi

prolog - 序言中的保护条款?

转载 作者:行者123 更新时间:2023-12-04 03:58:58 25 4
gpt4 key购买 nike

它们存在吗?它们是如何实现的?

coroutining SWI-Prolog 的谓词(freezewhendif 等)具有 guards 的功能.它们如何适应首选的 Prolog 编程风格?

我对逻辑编程非常陌生(使用 Prolog 和全部),并且对它不是纯粹的声明性的事实感到有些困惑,即使在非常简单的情况下也需要程序考虑(参见 question about using \== or dif )。我错过了什么重要的东西吗?

最佳答案

首先是术语问题:freeze/2也不是 when/2也不是 dif/2在任何情况下都被称为 guard 。 guard 出现在 CHR 等扩展名中,或相关语言如 GHC (日文链接)或其他Concurrent logic programming languages ;您甚至(在某些限制下)可能会考虑以下形式的条款

Head :- Guard, !,...



在这种情况下,包含 guard 和剪切的子句将被称为提交。但没有一个适用于上述原语。守卫的灵感来自 Dijkstra 的 Guarded Command Language 1975 年。
freeze(X, Goal) (原名 geler )与 when(nonvar(X), Goal) 相同并且它们在声明上都等同于 Goal .与守卫的功能没有直接关系。但是,当与 if-then-else 一起使用时,您可能会实现这样的保护。但那是完全不同的。
freeze/2一段时间以来,类似的结构被认为是改进 Prolog 执行机制的一般方法。然而,事实证明它们使用起来非常脆弱。通常,他们过于保守,从而不必要地延迟了目标。也就是说,几乎每个有趣的查询都会产生一个“挣扎”的答案,如下面的查询。此外,终止程序和非终止程序之间的界限现在要复杂得多。对于终止的纯单调 Prolog 程序,在程序中添加一些终止目标将保留整​​个程序的终止。但是,使用 freeze/2这已不再是这种情况。然后从概念的角度来看, freeze/2没有得到系统顶层的很好支持:只有少数系统以全面的方式显示了延迟目标(例如 SICStus),这对于理解成功/答案和解决方案之间的区别至关重要。随着延迟的目标,Prolog 现在可能会产生一个没有解决方案的答案:

?- 卡住(X,X = 1),卡住(X,X = 2)。
卡住(X,X=1),
卡住(X,X=2)。
freeze/2 的另一个困难|是终止条件更难确定。所以,虽然 freeze本来应该通过终止来解决所有问题,但它经常会产生新问题。

而且还有更多与 freeze/2相关的技术难点特别是 w.r.t 表格和其他防止循环的技术。考虑一个目标 freeze(X, Y = 1)很明显, Y现在是 1即使还没有绑定(bind),它仍然在等待 X先绑定(bind)。现在,一个实现可能会考虑为一个目标制定表 g(Y) . g(Y)现在要么没有解决方案,要么只有一个解决方案 Y = 1 .此结果现在将作为 g/1 的唯一解决方案存储。自从 freeze -goal 对目标不直接可见。

正是出于这样的原因, freeze/2被认为是约束逻辑编程的goto。

另一个问题是 dif/2今天被认为是一个约束。与 freeze/2 相比和其他协同程序原语一样,约束能够更好地管理一致性并保持更好的终止属性。这主要是因为约束引入了定义明确的语言,具体属性可以得到证明,并且已经开发了特定的算法并且不允许一般目标。然而,即使对他们来说,也有可能获得不是解决方案的答案。更多关于 answer and success in CLP .

关于prolog - 序言中的保护条款?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13759971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com