Сравните мощность множества множеств и получите конкретное значение от члена наибольшего множества - PullRequest
0 голосов
/ 22 ноября 2018

Я использую clingo для решения flood-it проблем.Я использую предикат frontier([CELL], [COLOR], [TIMESTEP]) для отслеживания всех ячеек, которые являются соседями потока.Набор границ может выглядеть примерно так:

frontier(c(1,3),2,3) frontier(c(2,1),2,3) frontier(c(2,2),3,3) frontier(c(2,3),3,3) frontier(c(3,1),3,3) frontier(c(3,2),3,3) frontier(c(4,1),3,3)

Мы можем разделить этот набор на два подмножества.Один, где каждое значение цвета равно 2 или 3 соответственно.Что мне нужно, так это две вещи:

  1. . Определите, какое подмножество больше, т. Е. Если есть больше ячеек со значением цвета 2 или 3 (Кстати, количество цветов не фиксировано, поэтому решение должнобыть универсальным)
  2. Получить значение цвета члена наибольшего набора

Как я могу сравнить количество элементов n (n> = 2) в логике предикатов?

Заранее спасибо!

1 Ответ

0 голосов
/ 18 декабря 2018

Я нашел ответ, который более специфичен для предметной области (т.е. клинго), чем общий.

Сначала я подсчитал количество ячеек, имеющих цвет C:

frontier_subset_size(C,N) :- color(C), N = #count{ X : frontier(X,C) }.

Затем я отфильтрую самые большие наборы, используя совокупность #max:

max_subset_color(C) :- frontier_subset_size(C,N), N = #max{ M : frontier_subset_size(_,M) }.

Это работает так, как требуется для этой конкретной проблемы.

И все же я хотел бы знать, как это сделать в чистой логике предикатов.

...