2

私は「事実」の次の構造を持っています。

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

1 に答える 1