是否有更快的方法来编译或索引大量事实以提高速度?我有大约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,!.
祝你好运
泰
答案 0 :(得分:2)
大多数Prolog在谓词的第一个参数上使用索引,因此重新排序参数有时可能是一个好主意。在一些Prolog方言中,例如SWI,您可以使用:-index指令明确指出索引应该如何完成。
您的实施建议使用传递闭包变体。如果将Id1和Id2接地,则可以考虑区分递归和非递归情况(1)并通过调用非递归情况(2)将第一个调用替换为第二个子句体中的connected / 2。最后,您可以考虑跟踪已访问的ID,这样您就不需要重新访问它们了。
答案 1 :(得分:0)
对于某些极端情况,也许您必须使用C / C ++来重新编码链接的事实和关联的谓词。进一步优化;返回已连接对象的完整列表。