使用swi prolog搜索静态事实的最快方法?

使用swi prolog搜索静态事实的最快方法?,prolog,swi-prolog,Prolog,Swi Prolog,有没有更快的方法来编译或索引大量事实以提高速度?我有大约30000个链接形式的事实(groupid,id) 并尝试查找给定id的连接,但速度非常慢。我使用规则 connected(Id1,Id2) :- linked(Grp1,Id1), linked(Grp1,Id2), \+Id1=Id2. connected(Id1,Id2) :- connected(Id1,Id3), connected(Id3,Id2), \+Id1=Id2,!. 大多数序言对

有没有更快的方法来编译或索引大量事实以提高速度?我有大约30000个链接形式的事实(groupid,id)

并尝试查找给定id的连接,但速度非常慢。我使用规则

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

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

大多数序言对谓词的第一个参数使用索引,因此有时重新排序参数可能是个好主意。在某些Prolog方言中,例如SWI,您可以使用:-index指令显式指示应如何进行索引


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

对于外部情况,也许你必须使用C/C++来重新解释相关的事实和连接。进一步优化;返回已连接对象的完整列表。

请参阅:SWI、YAP、Jekejeke index on几个参数,这样您就不再需要
:-index
指令。