我需要在某些Prolog问题中使用正向链接器。我想避免自己用一个普通的元解释器从头开始实现它(但如果没有其他选择,我将不得不这样做),因为用元解释器做这件事会很慢,而且我相信应该有一些好的实现。有没有人知道YAP或SWI Prolog是否包含了一个原生的、高效的转发链接器?如果是这样的话,如何安装/使用它的指针将不胜感激。
如果这两个Prolog引擎上没有可用的本机正向链接器,有没有人可以推荐一个基于普通元解释器的好的开源实现,我可以将其用作外部Prolog库?
提前谢谢。
发布于 2012-05-06 09:07:29
YAP和SWI都包括一个约束处理规则的实现- http://dtai.cs.kuleuven.be/projects/CHR/ -这是一个正向链接规则系统。
我不能谈论它在您的特定问题上的性能,但众所周知,CHR是有效的(请参阅CHR站点链接的论文)。
CHR还具有Java、Haskell和C实现,因此如果以后需要更好的性能,可以很容易地将规则移植到这些语言中的一种。
发布于 2012-05-06 08:07:53
让我们从最小逻辑而不是归结定理证明的角度来解释反向链接和正向链接。正规反向链接Prolog规则可以看作是极小逻辑的左蕴涵引入规则的一个应用。所以基本上,当我们有一个目标P和一个规则A->P时,组合推理规则说我们可以用目标A替换目标P:
-------- (Id)
P |- P G, A -> P |- A
--------------------------------- (Left ->)
G, A -> P |- P现在可以使用相同的规则对正向链接应用程序进行建模。这一次,我们没有目标P,而是在前提中实现了条件A。当有一个规则A -> P时,这个规则也允许我们物化头部P。组合推理规则如下:
------- (Id)
A |- A G, A, A -> P, P |- B
--------------------------------------- (Left ->)
G, A, A -> P |- B我们的小程序的思想是完全计算正向链过程的不动点F(M) =M。我们所做的是计算迭代M0,M1,M2等。只有当进程以有限的结果终止时,它才起作用。从演绎数据库中,我们采用了只计算Mn+1和Mn之间的增量的思想。有可能找到一个G,使得F(Mn)\Mn = G(Mn\Mn-1,Mn-1)的工作量相对较小。
G的当前实现可能会在循环数据上出错,因为目前还没有消除重复数据。在也允许删除事实的转发链接器中,可以使用特殊的转发规则来消除重复项。成熟的正向链接系统无论如何都应该允许删除事实,然后它们甚至可以用来实现约束求解系统。
但让我们暂时把它留给简单的想法和相应的简单代码。
来自F函数的G函数(增量/2)(原始规则)
http://www.xlog.ch/jekejeke/forward/delta.p
带正向链接的玩具专家系统
http://www.xlog.ch/jekejeke/forward/expert.p
https://stackoverflow.com/questions/10466682
复制相似问题