Правило эффективного подсчета в 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? Что мне не хватает?