Агрегаты в клинго

Я сгенерировал:

curr(p5,2) curr(p5,1) curr(p5,6)

Как я могу суммировать лазерные поля 2+1+6?

На странице 21 clingo_guild.pdf я увидел следующее:

15 :- not M-2 [ enroll(C) : hours(C,H) = H ] M, max_hours(M).

и подойди:

#sum [pick(P) : curr(P,I) = I].

но я получаю:

ERROR: unstratified predicate in:
bus3.lp:73:2: #sum[pick(P)=I:curr(P,I)].
bus3.lp:73:17: curr/2

Я использую клинго 3.0.4. Спасибо за помощь.


person tak-po li    schedule 30.04.2015    source источник


Ответы (2)


Я предполагаю, что вам понадобятся итоги для каждого «выбора», и я предполагаю, что выбор определяется как

pick(P) :- curr(P, _).

Вы должны указать в коде, какой выбор вы имеете в виду. В случае с руководством clingo3, который вы цитируете, это не требуется.

В клинго3:

% clingo3
curr(p4,2). curr(p4,2). curr(p4,6).
curr(p5,2). curr(p5,1). curr(p5,6).

pick(P) :- curr(P, _).
% for each pick P, sum all I from matching curr(P, I)
totals(P, S) :- S = #sum[ curr(P,I) = I ], pick(P).

#hide.
#show totals/2.

И в clingo4, который использует более последовательный способ их выражения:

% clingo4
% ...
totals(P, S) :- S = #sum{ I : curr(P,I)}, pick(P).
#show totals/2.
person vukk    schedule 02.05.2015

curr(p5,2). curr(p5,1). curr(p5,6).

sum(S) :- S = #sum{Y: curr(X,Y)}.

Вывод:

clingo version 5.0.0
Solving...
Answer: 1
curr(p5,2) curr(p5,1) curr(p5,6) sum(9)
SATISFIABLE
person Andrew Jones    schedule 02.12.2018