1

有没有更快的方法来编译或索引大量事实以提高速度?我有大约 30K 形式的事实 linked(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,!.
4

2 回答 2

3

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

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

于 2012-03-22T15:00:52.183 回答
0

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

于 2020-10-04T06:44:26.997 回答