2

我有以下“事实”结构。

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).
4

1 回答 1

4

编写高效 Prolog 代码的关键是将尽可能多的工作委派给引擎

您显式执行的所有操作(即在 Prolog 中)通常会比由核心引擎隐式完成的操作要。如果不是这样,则意味着核心引擎有改进的机会。

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

怎么样让路,把它全部委托给 Prolog 的内置回溯?

true_q_ix(Q, Ix) :-
    如果(条件,Q,IX),
    cond_is_true(条件)。

findall/3,什么都没有:只是简单的回溯,产生所有Q,并且在您的解释IxCond评估为真。

不要做任何事!没有什么!

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

于 2018-02-04T21:31:04.220 回答