首页 文章

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

提问于
浏览
0

是否有更快的方法来编译或索引大量事实以提高速度?我有大约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,!.

最好的祝福

1 回答

  • 2

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

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

相关问题