YAP Prolog中的正向链接?

YAP Prolog中的正向链接?,prolog,Prolog,我需要在某些Prolog问题中使用前向链表。 我希望避免自己用普通的元解释器从头开始实现它(但如果没有其他选择,我将不得不这么做),因为用元解释器实现这一点会很慢,而且我相信应该会有一些好的实现。 有人知道YAP或SWI Prolog是否包含本机高效的转发链接器吗?。如果是这样的话,请提供如何安装/使用它的指针 如果这两个Prolog引擎上没有本机转发链接器,有人能推荐我一个基于普通元解释器的好的开源实现,我可以将它用作外部Prolog库吗 提前感谢。让我们用最小逻辑而不是解析定理证明来解释反向

我需要在某些Prolog问题中使用前向链表。 我希望避免自己用普通的元解释器从头开始实现它(但如果没有其他选择,我将不得不这么做),因为用元解释器实现这一点会很慢,而且我相信应该会有一些好的实现。 有人知道YAP或SWI Prolog是否包含本机高效的转发链接器吗?。如果是这样的话,请提供如何安装/使用它的指针

如果这两个Prolog引擎上没有本机转发链接器,有人能推荐我一个基于普通元解释器的好的开源实现,我可以将它用作外部Prolog库吗


提前感谢。

让我们用最小逻辑而不是解析定理证明来解释反向链接和正向链接。正规后向链式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)

具有正向链接的玩具专家系统

YAP和SWI都包含约束处理规则的实现——这是一个正向链接规则系统

我不能就您的特定问题谈论它的性能,但CHR是高效的(参见CHR网站链接的论文)


CHR还有Java、Haskell和C实现,因此,如果以后需要更好的性能,您可以轻松地将规则移植到这些语言中的一种。

感谢您的回答@NickMain。您知道该软件包是否默认包含在YAP安装中吗?。一个与效率相关的问题:不知何故,我认为在高度优化的Prolog引擎(如YAP)中实现的前向链表应该比在非逻辑语言(如Java或C)中实现的前向链表更快。这不一定是真的吗?YAP手册中包含了一节关于CHR的内容——可能是这样。在SWI中,您只需要
:-使用_模块(库(chr))。
关于chr的C实现的一篇论文包括一些比较SWI、Java和C版本的基准测试。看起来SWI和Java相当,而C快得多。