В дополнение к классным диаграммам Майка, вот способ проверить, является ли произвольный конечный список списков топологией, то есть, (1) если он содержит пустой набор, (2) базовый набор, (3) закрытыйв конечных пересечениях и (3) закрыто в объединении:
topologyQ[x_List] :=
Intersection[x, #] === # & [
Union[
{Union @@ x},
Intersection @@@ Rest@#,
Union @@@ #
] & @ Subsets @ x
]
Применительно к шести примерам
list1 = {{}, {1, 2, 3}};
list2 = {{}, {1}, {1, 2, 3}};
list3 = {{}, {1}, {2}, {1, 2}, {1, 2, 3}};
list4 = {{}, {2}, {1, 2}, {2, 3}, {1, 2, 3}};
list5 = {{}, {2}, {3}, {1, 2, 3}};
list6 = {{}, {1, 2}, {2, 3}, {1, 2, 3}};
подобно
topologyQ /@ {list1, list2, list3, list4, list5, list6}
дает
{True, True, True, True, False, False}
РЕДАКТИРОВАНИЕ 1: Для дальнейшего уточнения формулировки обратите внимание, что оператор
topoCover := (Union @@ {Union @@@ #, Intersection @@@ Rest@#} &)@Subsets@# &
дает коллекцию, полученную путем взятия всех объединений и пересечений элементов набора множеств.Набор множеств list
является топологией, если он является фиксированной точкой оператора topoCover
.Таким образом, можно определить альтернативную функцию для проверки, является ли list
топологией:
topologyQ2 := (topoCover@# === #) &
Если list
не является топологией, topoCover
дает наименьший надмножество list
, которое является топологией.Поэтому
Complement[topoCover@#,#]&
дает элементы, которые нужно добавить к list
, чтобы сделать его топологией.
Можно также рассмотреть наибольшее подмножество (ы) list
, которое является топологией, и элемент (ы), которые нужно удалить из list
, чтобы топологизировать его.Это делается с помощью
maxTopoSubset := (If[{} == #, None, Last@#] &)@(GatherBy[
Select[Subsets@#, topologyQ], Length[#] &]) &
Применительно, например, к list6
как
maxTopoSubset@list6
, мы получаем две топологии
{{}, {1, 2}, {1, 2, 3}}, {{}, {2, 3}, {1, 2, 3}}}
Чтобы получитьэлементы, которые нужно удалить, чтобы получить топологию из list
, можно использовать
removeToTopologize := Table[Complement[#, Part[maxTopoSubset@#, i]], {i,
Length@maxTopoSubset@#}] &
Используя с list6
как
removeToTopologize@list6
, мы получим
{{{2, 3}}, {{1, 2}}}
то есть удаление {2,3}
или {1,2}
из list6
дает топологию.