9 prolog guard-clause prolog-dif prolog-coroutining
它们存在吗?他们是如何实施的?
所述coroutining SWI-Prolog的(的谓词freeze,when,dif等)具有的功能警卫.它们如何适合首选的Prolog编程风格?
我是很新的逻辑编程(有序言和共)和事实,即它不是纯粹的声明,并要求即使在非常简单的情况下程序上的考虑有点困惑(见本关于使用问题\==或dif).我错过了重要的事吗?
首先是一个术语问题:在任何情况下都freeze/2不会也when/2不会dif/2被称为警卫.警卫以CHR等扩展名或GHC(日语链接)或其他并发逻辑编程语言等相关语言出现 ; 你甚至(在某些限制下)可能会考虑表格的条款
头
:-卫, !,......
因为包含一个后卫和裁员的条款在这种情况下称为提交.但是没有一个适用于上述原语.卫兵的灵感来自于1975年Dijkstra的守卫指挥语言.
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).
另一个困难freeze/2是终止条件更难以确定.因此,虽然freeze应该解决所有终止问题,但它经常会产生新的问题.
并且还存在与freeze/2特别是wrt制表和其他防止循环的技术相关的更多技术难题.freeze(X, Y = 1)清楚地考虑一个目标,Y现在1即使它尚未受约束,它仍然等待X首先受到约束.现在,实现可能会考虑制定目标g(Y).g(Y)现在将没有解决方案或只有一个解决方案Y = 1.现在,这个结果将被存储为唯一的解决方案,g/1 因为freeze目标不能直接看到-goal.
出于这样的原因,它freeze/2被认为是约束逻辑编程的结果.
另一个问题是dif/2今天被视为一种约束.与freeze/2其他coroutining原语相比,约束能够更好地管理一致性并且还能够保持更好的终止属性.这主要是因为约束引入了明确定义的语言,可以证明具体的属性并且已经开发了特定的算法并且不允许一般目标.然而,即使对他们来说,也可以获得不是解决方案的答案.更多关于CLP的回答和成功.