2011-08-19 17 views
0

有没有更快的方式来编译或索引大量的事实来提高速度?我有大约30K的链接形式的事实(groupid,id)用swi prolog搜索静态事实的最快方法是什么?

并尝试找到给定id的连接,但它确实很慢。我用的是规则

connected(Id1,Id2) :- 
    linked(Grp1,Id1), 
    linked(Grp1,Id2), 
    \+Id1=Id2. 

connected(Id1,Id2) :- 
    connected(Id1,Id3), 
    connectedId3,Id2), 
    \+Id1=Id2,!. 

问候

+4

请参阅:https://lists.iai.uni-bonn.de/pipermail/swi-prolog/2011/2011007061.html – Kaarel

回答

2

大多数Prologs使用索引谓词的第一个参数,所以有时重新排序参数可能是一个好主意。在一些Prolog方言中,例如SWI,您可以明确指出如何使用:-index指令完成索引。

你的实现建议了一个传递闭包变体。如果Id1和Id2接地,可以考虑区分递归和非递归情况(1),并通过调用非递归情况(2)将第一个调用替换为第二个子句正文中的connected/2。最后,你可以考虑跟踪被访问的ID,这样你就不需要重新访问它们。

+1

SWI,YAP,Jekejeke索引的几个参数,所以你不再需要': - 索引“指令。 – false

相关问题