Я разрабатываю библиотеку классов для дискретной математики, и я не могу придумать способ реализации бесконечного набора.
То, что у меня есть до сих пор: у меня есть абстрактный базовый класс Set, который реализует интерфейс ISet. Для конечных множеств я получаю класс FiniteSet, который реализует каждый метод набора. Затем я могу использовать его следующим образом:
FiniteSet<int> set1 = new FiniteSet<int>(1, 2, 3);
FiniteSet<int> set2 = new FiniteSet<int>(3, 4, 5);
Console.WriteLine(set1); //{1, 2, 3}
Console.WriteLine(set2); //{3, 4, 5}
set1.UnionWith(set2);
Console.WriteLine(set1); //{1, 2, 3, 4, 5}
Теперь я хочу представить бесконечный набор. У меня возникла идея получить еще один абстрактный класс из набора, InfiniteSet, а затем разработчики, использующие библиотеку, должны были бы получить от InfiniteSet для реализации своих собственных классов. Я бы поставлял часто используемые наборы, такие как N, Z, Q и R.
Но я понятия не имею, как реализовать такие методы, как Subset и GetEnumerator - я даже начинаю думать, что это невозможно. Как вы перечислите бесконечный набор практическим способом, чтобы вы могли пересечь/объединить его с другим бесконечным множеством? Как вы можете проверить в коде, что N является подмножеством R? А что касается вопроса о мощности... Ну, это, наверное, отдельный вопрос.
Все это приводит меня к выводу, что моя идея реализовать бесконечный набор - это, вероятно, неправильный путь. Я очень благодарен за ваш вклад:).
Изменить: просто чтобы быть ясным, я также хотел бы представлять несчетно бесконечные множества.
Edit2: Я думаю, важно помнить, что конечной целью является внедрение ISet, что означает, что любое решение должно предоставлять (как должно) способы реализовать все Методы ISet, наиболее проблематичными из которых являются методы перечисления и метод IsSubsetOf.