我在 ASP / `cligo (Version 4+) 中使用 python 脚本时遇到了一个基本问题。我用一个最小的例子重建了这个问题,以说明这一点。显然,在示例中,我不需要使用脚本。然而,在我更复杂的应用程序中,我以一种更易于理解的方式人为地重新创建了问题。
问题是,在调用聚合/优化时,编译器不会以某种方式注册所有用于索引值的完整谓词。相反,它似乎是连续计算最小值,结果是沿途吐出所有值。(见下面的输出:注意最小值从 59 到 19,然后没有变为 29。这对代码部分中的prg.ground
调用顺序非常敏感#script (python)
。)
这是非常不可取的,我想知道如何避免这个问题。即,我怎样才能修改下面的代码仍然使用 python 脚本(可能修改),以便计算正确的模型。(在这个例子中,很明显,谓词的解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