有效的Findall()处理



我具有以下"事实"的结构。

if( conds, score, idx).

那么我希望有成千上万的人。" CONDS"是随着事实的处理,将进行评估的条件。对于每个事实,我将分数和索引存储在列表中以进行进一步处理。一般的想法是findall/3事实,然后浏览它们...

findall([Cond, Q, Ix], clause(if(Cond, Q, Ix), true), Conds)
check(Conds, True_QIxLst) ...

我担心的是,每次运行的findall/3都会吞噬所有千千种事实,即使用过多的内存。

我将如何做findall做的事情,但是一对一地处理条件。我仍然会处理所有条件,但是我想使用更少的内存。


根据"垫子"的建议,这似乎可以解决:

is_true(Q,Ix) :-
   if(Cond, Q, Ix),
   check(Cond).
run(QI) :-
   findall([Q,Ix], is_true(Q,Ix), QI).

编写有效的Prolog代码的关键是将尽可能多的工作委派给 Engine 。。

您明确执行的所有操作(即,在prolog中(通常会比慢,如果core  Engine 隐式实现了同一件事。如果不是这种情况,那意味着有机会改善核心发动机。

在您的特殊情况下,如果findall/3会使用过多的内存,请考虑是否需要findall/3对于您的用例也需要。

如何摆脱困境,并将其全部委派给Prolog的内置回溯?

true_q_ix(q,ix(: -     if(cond,q,ix(,    cond_is_true(cond(。

no findall/3,没有什么都没有:只是平原回溯,产生所有 QIxCond在您的解释中评估为true。

什么都不做!没有!

如有必要,您仍然可以将其包裹在findall/3中,支付其各种费用。

相关内容

  • 没有找到相关文章

最新更新