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

时间:2011-08-19 02:29:54

标签: prolog swi-prolog

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

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

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

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

祝你好运

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

对于某些极端情况,也许您必须使用C / C ++来重新编码链接的事实和关联的谓词。进一步优化;返回已连接对象的完整列表。