我有以下“事实”结构。
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).