У меня возникла основная проблема при использовании сценариев python в ASP/`clingo (версия 4+). Я проиллюстрировал проблему с минимальным примером, чтобы проиллюстрировать эту точку. Очевидно, что в этом примере мне не нужно использовать скрипты. В моем более сложном приложении, однако, я делаю, откуда я искусственно воссоздал проблему, более понятным образом.компилятор clingo, вычисляющий несколько значений для #min
Проблема заключается в том, что при вызове агрегата/оптимизации компилятор каким-то образом не регистрирует весь полный предикат, используемый для индексации значений. Вместо этого он, кажется, последовательно вычисляет минимум и, как результат, выплескивает все значения на этом пути. (См. Выход ниже: обратите внимание на то, что минимальное значение составляет от 59 до 19, а затем не изменяется на 29. Это очень чувствительно к порядку prg.ground
звонков в части кода #script (python)
.)
Это очень нежелательно, и я хотел бы знать, как избежать этой проблемы. I. e., , как я могу изменить приведенный ниже код, все еще используя скрипт 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
Примечание: аналогичные проблемы возникают с '# max' и' # sum'. Каким бы ни было решение (если оно существует), оно должно быть адаптировано к ситуации, в которой эти другие агрегаты вычисляются. – Thomas