私は「事実」の次の構造を持っています。
if( conds, score, idx).
それから私はそれらの何千もあると期待しています。「条件」は、ファクトが処理されるときに評価される条件です。真であるすべての事実について、スコアとインデックスをリストに保存して、さらに処理します。一般的な考え方は、findall/3
事実を調べてからそれらを調べることです...
findall([Cond, Q, Ix], clause(if(Cond, Q, Ix), true), Conds)
check(Conds, True_QIxLst) ...
私の心配は、findall/3
実行ごとに何千もの事実を飲み込んでしまうことです。つまり、メモリを使いすぎます。
どうすればいいのでしょうfindall
が、条件を1つずつ処理します。すべての条件を引き続き処理しますが、メモリの使用量を減らしたいと考えています。
「マット」の提案によると、これはうまくいくようです:
is_true(Q,Ix) :-
if(Cond, Q, Ix),
check(Cond).
run(QI) :-
findall([Q,Ix], is_true(Q,Ix), QI).