我需要在某些Prolog问题中使用前向链接器。 我想避免使用vanilla元解释器从头开始实现它(但如果没有其他选项可用,那就是我将要做的事情),因为使用元解释器这样做会很慢,而且我也是我相信一些好的实现应该存在。 有人知道YAP或SWI Prolog是否包含本地且有效的前向链接器?如果是这种情况,将非常感谢指向如何安装/使用它的指针。
如果这两个Prolog引擎上没有本地前向链接器,有人可以推荐我一个基于vanilla元解释器的开源实现,我可以将其用作外部Prolog库吗?
提前致谢。
答案 0 :(得分:4)
让我们用最小逻辑来解释反向链接和正向链接,而不是用分辨率定理证明。正常的后向链接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函数(delta / 2)(原规则)
http://www.xlog.ch/jekejeke/forward/delta.p
具有正向链接的玩具专家系统
http://www.xlog.ch/jekejeke/forward/expert.p
答案 1 :(得分:3)
YAP和SWI都包含约束处理规则的实现 - http://dtai.cs.kuleuven.be/projects/CHR/ - 这是一个正向链规则系统。
我无法谈论其针对您的特定问题的表现,但已知CHR是有效的(请参阅CHR网站上链接的论文)。
CHR还有Java,Haskell和C实现,因此如果以后需要更好的性能,您可以轻松地将规则移植到其中一种语言。