prolog中的保护子句?

prolog中的保护子句?,prolog,prolog-dif,guard-clause,prolog-coroutining,Prolog,Prolog Dif,Guard Clause,Prolog Coroutining,它们存在吗?它们是如何实施的 SWI Prolog的谓词(freeze、when、dif等)具有的功能是。它们如何适应首选的Prolog编程风格 我对逻辑编程(包括Prolog和其他)非常陌生,并且有点困惑,因为它不是纯声明性的,即使在非常简单的情况下也需要过程性的考虑(见此)。我遗漏了什么重要的东西吗?冻结/2和/2就像逻辑编程的“goto”一样。它们不是纯的、可交换的等 另一方面,dif/2是完全纯的、声明性的、单调的、交换的等等。dif/2是一个声明性谓词,如果它的参数不同,它就成立。至于

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

SWI Prolog的谓词(
freeze
when
dif
等)具有的功能是。它们如何适应首选的Prolog编程风格


我对逻辑编程(包括Prolog和其他)非常陌生,并且有点困惑,因为它不是纯声明性的,即使在非常简单的情况下也需要过程性的考虑(见此)。我遗漏了什么重要的东西吗?

冻结/2和/2就像逻辑编程的“goto”一样。它们不是纯的、可交换的等

另一方面,dif/2是完全纯的、声明性的、单调的、交换的等等。dif/2是一个声明性谓词,如果它的参数不同,它就成立。至于“首选Prolog编程风格”:请说明其适用性。如果您想表达两个通用术语不同的约束,dif/2正好说明了这一点


当您不在Prolog的纯声明性子集中编程,而是使用不可交换的不纯谓词时,通常最需要考虑程序性因素。在现代Prolog系统中,几乎没有理由离开纯粹的声明性子集。

首先是一个术语问题:当/2或
在任何情况下被称为守卫时,无论是
冻结/2
还是
。卫兵以扩展名或相关语言出现,如(日语链接)或其他;甚至(在某些限制下)也可以考虑表格

的子句 头部
:-
防护

在这种情况下,包含保护和剪切的as子句更被称为commit。但没有一个适用于上述原语。卫兵们的灵感来源于1975年的迪杰斯特拉

freeze(X,Goal)
(最初称为
geler
)与
when(nonvar(X,Goal)
相同,它们在声明上都等同于
Goal
。与防护装置的功能没有直接关系。然而,当与if-then-else一起使用时,您可能会实现这样的保护。但这是完全不同的

freeze/2
和类似的结构一度被认为是改进Prolog执行机制的一种通用方法。然而,事实证明,它们使用起来非常脆弱。通常,他们过于保守,因此不必要地推迟了目标。也就是说,几乎每个有趣的查询都会产生一个“挣扎”的答案,如下所示。此外,终止程序和非终止程序之间的界限现在要复杂得多。对于终止的纯单调Prolog程序,在程序中添加一些终止目标将保持整个程序的终止。但是,对于
freeze/2
,情况不再如此。然后,从概念角度来看,
freeze/2
没有得到顶级系统的很好支持:只有少数系统以全面的方式(例如SICStus)显示延迟目标,这对于理解成功/答案和解决方案之间的差异至关重要。对于延迟目标,Prolog现在可能会产生一个没有解决方案的答案:

?- freeze(X, X = 1), freeze(X, X = 2). freeze(X, X=1), freeze(X, X=2). -冻结(X,X=1),冻结(X,X=2)。 冻结(X,X=1), 冻结(X,X=2)。
freeze/2
的另一个困难是终止条件更难确定。因此,虽然
freeze
本应解决所有与终止有关的问题,但它往往会产生新的问题

还有更多的技术困难与
freeze/2
有关,特别是w.r.t表格和其他防止循环的技术。考虑一个目标<代码>冻结(x,y=1)< /代码>清楚,<代码> y>代码>现在是代码> 1 < /代码>,即使它还没有被绑定,它仍然要等待<代码> x>代码>首先绑定。现在,一个实现可以考虑一个目标>代码> g(y)。code>g(Y)
现在要么没有解决方案,要么只有一个解决方案
Y=1
。该结果现在将存储为
g/1
的唯一解决方案,因为
freeze
-目标对目标不直接可见

正是由于这些原因,
freeze/2
被认为是约束逻辑编程的目标


另一个问题是
dif/2
,今天它被认为是一个约束。与
freeze/2
和其他协同路由原语相比,约束能够更好地管理一致性,并维护更好的终止属性。这主要是因为约束引入了定义良好的语言,而具体属性可以被证明,特定算法已经开发出来,不允许实现一般目标。然而,即使对他们来说,也有可能得到并非解决方案的答案。更多信息。

有一篇由Evan Tick撰写的论文解释CC:

非正式地说,过程调用通过匹配 头部争论(被动统一)和满足守卫目标。 当目标可以提交到过程中的多个子句时,它 非决定性地向其中一个(其他候选人)提交 被扔掉了)。出现在头部和防护罩中的结构 如果相应的论点成立,第条将导致暂停执行 目标的定义没有得到充分的实例化。暂停的调用 当与挂起的变量关联时,可以稍后恢复 调用被充分实例化

并发逻辑编程语言的发展
埃文·蒂克-1995年

所以我想,使用when/2魔法,一个承诺的选择代码可以 被改写成普通的序言。方法如下: 跟随。对于同一谓词的一组提交选择规则:

H1 :- G1 | B1.
...
H2 :- Gn | Bn.
这可以改写为以下内容,其中Hi'和Gi' 需要实行被动统一。例如使用 国际标准化组织勘误表第2部分

H1' :- G1', !, B1.
..
H1' :- Gn', !, Bn.
H :- term_variables(H, L), when_nonvar(L, H).
上述翻译不适用于CHR,因为CHR是doe