我具有以下"事实"的结构。
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
,没有什么都没有:只是平原回溯,产生所有 Q
和 Ix
, Cond
在您的解释中评估为true。
什么都不做!没有!
如有必要,您仍然可以将其包裹在findall/3
中,支付其各种费用。