ASP / `clingo (バージョン 4 以降) で Python スクリプトを使用しているときに、基本的な問題が発生しています。ポイントを説明するために、最小限の例で問題を再構築しました。明らかに、この例では、スクリプトを使用する必要はありません。しかし、私のより複雑なアプリケーションでは、よりわかりやすい方法で問題を人為的に再現しました。
問題は、集約/最適化を呼び出している間、値のインデックス付けに使用されているすべての完全な述語を何らかの形でコンパイラが登録しないことです。代わりに、最小値を連続して計算しているように見え、その結果、途中ですべての値が吐き出されます。(以下の出力を参照してください。最小値が 59 から 19 になり、その後 29 に変化しないことに注意してください。これは、コードprg.ground
の一部の呼び出しの順序に非常に敏感#script (python)
です。)
これは非常に望ましくないため、この問題を回避する方法を知りたいです。つまり、正しいモデルが計算されるように、まだ python-script (変更されている可能性があります) を使用している以下のコードをどのように修正できますか。(この例では、明らかに、述語の解決策min_sel_weight/1
はmin_sel_weight(19)
それ以上の値がないことです。
プログラム。
weight("ant",3). weight("bat",53). weight("cat",19). weight("dot",13). weight("eel",29).
#script (python)
import gringo;
def main(prg):
prg.ground([('base', [])]);
prg.ground([('sel', ['bat'])]);
prg.ground([('sel', ['cat'])]);
prg.ground([('sel', ['eel'])]);
prg.solve();
#end.
%% call python-script, to select certain objects.
#program sel(t). sel(t).
%% compute minimum of weights of selected objects:
min_sel_weight(X) :- weight(_,X), #min {XX : weight(OBJ,XX),sel(OBJ)} = X.
#show sel/1. #show min_sel_weight/1.
を呼び出す clingo 0 myprogramme.lp
と、次の出力が得られます。
clingo version 4.5.4 Reading from myprogramme.lp Solving... Answer: 1 sel("bat") min_sel_weight(53) sel("cat") min_sel_weight(19) sel("eel") SATISFIABLE Models : 1 Calls : 1 Time : 0.096s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s) CPU Time : 0.040s