对Prolog中的事实施加命令

Edo*_*chi 5 prolog

假设这f(X)是一个可以被asserted和retracted编辑的动态事实,并且假设它X始终是数字。现在,假设执行最多的查询是关于查找f(X)最小的查询。在SWI-Prolog中,我可以这样写:

min_f(R) :- aggregate(min(X), f(X), R).
Run Code Online (Sandbox Code Playgroud)

但是,显然,这总是使Prolog对所有事实执行线性搜索。现在,假设将有大量这样的事实(例如1,000,000)。由于我事先知道我会经常执行min_f/1

  • 我可以强加一个命令f/1,以便引擎可以在O(1)中找到最小值吗?
  • 我可以明确地assert包含所有事实的最小堆,然后窥视头部;事实可以隐式存储在最小堆中吗?

我对Prolog方言没有任何限制,因此任何其他Prolog实现都可以。