Правило эффективного подсчета в Clingo/ Программе набора ответов

Рассмотрим следующую программу набора ответов:

category(main, 5).
category(extra, 2).

num(main, 1..45).
num(extra, 1..12).

Count{draw(Category, Num, Draw) : num(Category, Num)}Count :-
    category(Category, Count),
    Draw = 1..n.

Это генерирует n розыгрыши результатов для лотереи EuroMillionen. Один розыгрыш состоит из 5 номеров из 1..45 и 2 номеров из 1..12.

Время выполнения этой программы невелико (несправедливо по сравнению с императивными языками), но вполне нормально. Вот статистика за -c n=30 --sign-def=3 (чтобы добраться до случайных решений):

Models       : 1+
Calls        : 1
Time         : 0.016s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s

Choices      : 401
Conflicts    : 0        (Analyzed: 0)
Restarts     : 0
Model-Level  : 401.0
Problems     : 1        (Average Length: 0.00 Splits: 0)
Lemmas       : 0        (Deleted: 0)
  Binary     : 0        (Ratio:   0.00%)
  Ternary    : 0        (Ratio:   0.00%)
  Conflict   : 0        (Average Length:    0.0 Ratio:   0.00%)
  Loop       : 0        (Average Length:    0.0 Ratio:   0.00%)
  Other      : 0        (Average Length:    0.0 Ratio:   0.00%)

Atoms        : 1950
Rules        : 359      (1: 179 2: 120 3: 60)
Bodies       : 241
Equivalences : 357      (Atom=Atom: 118 Body=Body: 0 Other: 239)
Tight        : Yes
Variables    : 1770     (Eliminated:    0 Frozen: 1770)
Constraints  : 120      (Binary:  0.0% Ternary:  0.0% Other:100.0%)

Теперь, если я попытаюсь подсчитать, как часто каждое число рисуется, оно становится настолько медленным, что его невозможно использовать. Вот модифицированная программа вместе со статистикой для -c n=30 --sign-def=3:

category(main, 5).
category(extra, 2).

num(main, 1..45).
num(extra, 1..12).

Count{draw(Category, Num, Draw) : num(Category, Num)}Count :-
    category(Category, Count),
    Draw = 1..n.


count(Category, Num, Count) :- num(Category, Num),
                               Count == { draw(Category, Num, Draw) }.

#show count/3.

Статистика:

Models       : 1+
Calls        : 1
Time         : 0.302s (Solving: 0.03s 1st Model: 0.02s Unsat: 0.00s)
CPU Time     : 0.250s

Choices      : 401
Conflicts    : 0        (Analyzed: 0)
Restarts     : 0
Model-Level  : 401.0
Problems     : 1        (Average Length: 0.00 Splits: 0)
Lemmas       : 0        (Deleted: 0)
  Binary     : 0        (Ratio:   0.00%)
  Ternary    : 0        (Ratio:   0.00%)
  Conflict   : 0        (Average Length:    0.0 Ratio:   0.00%)
  Loop       : 0        (Average Length:    0.0 Ratio:   0.00%)
  Other      : 0        (Average Length:    0.0 Ratio:   0.00%)

Atoms        : 16560    (Original: 8790 Auxiliary: 7770)
Rules        : 26105    (1: 3713/22793 2: 3426/3252 3: 60/60)
Bodies       : 7024
Equivalences : 15576    (Atom=Atom: 3481 Body=Body: 1653 Other: 10442)
Tight        : Yes
Variables    : 22860    (Eliminated:    0 Frozen: 3366)
Constraints  : 60426    (Binary: 75.1% Ternary: 21.7% Other:  3.2%)

Таким образом, решение - то же самое, но заземление - огромная проблема. Да, я мог бы сделать подсчет в скрипте Py thon, но разве нет эффективного способа просто подсчитать в ASP? Что мне не хватает?

0 ответов

Другие вопросы по тегам