1

我在 ASP / `cligo (Version 4+) 中使用 python 脚本时遇到了一个基本问题。我用一个最小的例子重建了这个问题,以说明这一点。显然,在示例中,我不需要使用脚本。然而,在我更复杂的应用程序中,我以一种更易于理解的方式人为地重新创建了问题。

问题是,在调用聚合/优化时,编译器不会以某种方式注册所有用于索引值的完整谓词。相反,它似乎是连续计算最小值,结果是沿途吐出所有值。(见下面的输出:注意最小值从 59 到 19,然后没有变为 29。这对代码部分中的prg.ground调用顺序非常敏感#script (python)。)

这是非常不可取的,我想知道如何避免这个问题。即,我怎样才能修改下面的代码仍然使用 python 脚本(可能修改),以便计算正确的模型。(在这个例子中,很明显,谓词的解min_sel_weight/1min_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
4

1 回答 1

0

尝试这个:

% instance
weight("ant",3). weight("bat",53). weight("cat",19). weight("dot",13). weight("eel",29).


% Assuming you will get certain selected objects like this:
selected("cat"). selected("bat"). selected("eel"). %this will be python generated

% encoding
selectedWeight(OBJ, XX):- weight(OBJ,XX), selected(OBJ).
1{min_sel_weight(X)}1 :- selectedWeight(_,X), #min {XX : selectedWeight(OBJ,XX),selected(OBJ)} = X.

#show min_sel_weight/1.

输出:

在此处输入图像描述

于 2017-11-18T16:10:44.980 回答