Как реализовать класс бесконечного множества?

Я разрабатываю библиотеку классов для дискретной математики, и я не могу придумать способ реализации бесконечное множество.

то, что у меня есть до сих пор: у меня есть абстрактный базовый класс 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}

теперь я хочу представить бесконечное множество. У меня была идея вывести еще один абстрактный класс из set, InfiniteSet, а затем разработчики, использующие библиотеку, должны были бы получить от InfiniteSet для реализации своих собственных классов. Я бы поставил обычно используемые наборы, такие как N, Z, Q и R.

но я понятия не имею, как реализовать такие методы, как Subset и GetEnumerator - я даже начинаю думать, что это невозможно. Как вы перечисляете бесконечное множество практическим образом, чтобы вы могли пересечь/объединить его с другим бесконечным множеством? Как вы можете проверить в коде, что N является подмножеством R? А вопрос о кардинальности.. Ну, это, наверное, отдельный вопрос.

все это приводит меня к выводу, что моя идея реализации бесконечного множества, вероятно, неправильный путь. Я был бы очень признателен за Ваш вклад :).

редактировать: просто чтобы быть ясно, я хочу представлять uncountably бесконечных множеств.

Edit2: я думаю, важно помнить, что конечной целью является реализация ISet, то есть любое решение должно обеспечить (как и должно) способы реализации всех методы Исет, наиболее проблемными из которых являются методы перечисления и метод IsSubsetOf.

5 ответов


невозможно полностью реализовать ISet<T> для uncountably бесконечных множеств.

вот доказательство (любезно предоставленное Бертраном Расселом):

Предположим, вы создали класс MySet<T> что может представлять uncountably бесконечное множество. Теперь давайте рассмотрим некоторые MySet<object> объекты.

мы обозначаем конкретный MySet<object>, назовем его instance,"ненормальным" если:

instance.Contains(instance) возвращает true.

аналогично, мы бы обозначили instance как "нормальный" если:

instance.Contains(instance) возвращает false.

обратите внимание, что это различие четко определено для всех instance.

теперь рассмотрим пример MySet<MySet<object>> под названием paradox.

мы определяем paradox как MySet<MySet<object>>, который содержит все возможные нормальный экземпляров MySet<object>.

что нужно paradox.Contains(paradox) вернуться?

если он возвращает true, потом paradox is ненормальным и должен был вернуть false при вызове на себя.

если он возвращает false затем paradox is нормальный, и должен был возвратить true при вызове на себя.

нет способа реализовать Contains чтобы разрешить этот парадокс, поэтому нет способа полностью реализовать ISet<T> для всех возможных несчетных множеств.


теперь, если вы ограничиваете мощность MySet<T> быть равным или меньше чем кардинальность континуума (/R/), тем вы сможете обойти этот парадокс.

даже тогда, вы не сможете реализовывать Contains или подобные методы, потому что это было бы эквивалентно решению проблемы остановки. (Помните, что множество all C# программы имеют мощность, равную |Z /

редактировать

чтобы быть более тщательным, вот объяснение моего утверждения ,что " это было бы эквивалентно решению проблемы остановки."

рассмотрим MySet<string> который состоит из всех программ на C# (в виде строк), которые останавливаются за конечное количество времени (Предположим, они останавливаются для любого ввода, если быть точным). Назовите это paradox2. Набор * рекурсивно перечислим", что означает, что вы можете реализовать GetEnumerator на нем (не легко, но возможно). Это также означает, что она четко определена. Однако этот набор не является "разрешимым", поскольку его дополнение не рекурсивно перечислимый.

определить программу на C# следующим образом:

using ... //Everything;

public static class Decider {

    private MySet<string> _haltingSet = CreateHaltingSet();

    static void Main(string [] args) {
        Console.WriteLine(_haltingSet.Contains(args[0]));
    }
}

скомпилируйте вышеуказанную программу и передайте ее в качестве входных данных себе. Что происходит?

если Contains метод правильно реализован, тогда вы решили проблему остановки. Однако мы знаем, что это невозможно, поэтому мы можем только заключить, что невозможно правильно реализовать Contains, даже для счетно-бесконечных множеств.

возможно, вы сможете ограничить MySet<T> класс для работы для всех разрешимых множеств. однако, тогда вы все равно столкнетесь со всеми видами проблем с вашей функцией никогда остановка в конечном количестве времени.

в качестве примера представим, что у нас есть произвольный точный реальный типReal, и пусть nonHalting быть экземпляр MySet<Real> это включает в себя все нетривиальные нули дзета-функции Римана (это разрешимое множество). Если вы можете правильно реализовать IsProperSubsetOf on nonHalting чтобы вернуться в конечный промежуток времени, когда прошло множество всех комплексных чисел с вещественной частью 1/2 (также разрешимое множество), тогда вы выиграете Премии Тысячелетия.


вам придется обобщить то, что вы подразумеваете под Set.

Если у вас будет бесконечный набор, Вы не сможете получить значимое перечисление над ним, поэтому вы не будете определять операции набора с операциями над перечислениями.

Если вы определили Set<f> с точки зрения bool IsMember(f obj) метод, его можно использовать для бесконечных множеств.

вы определяете объединение или пересечение двух множеств как логическое и или или метода IsMember двух множеств.


представляют uncountably бесконечных множеств

рассмотрим это утверждение в контексте того, как это делается на практике. Например, при запросе погоды множество A является подмножеством множества Z (положительные целые числа) субъект не Z. каждое число в Z не анализируется. Поскольку нет способа сравнить Ak (a sub k, где k-число между 1 и |A|) с каждым значением Z (бесконечным), каждое значение A должно быть сравнено с AK (a sub k, где k-число между 1 и / A/). свойства, которые составляют Z. Если каждое значение в A удовлетворяет свойствам Z, то A является подмножеством Z.

как вы можете представлять в коде R union n

тот же процесс, что и выше. Свойства R - "любое действительное число" - в коде это может быть" любой двойник, который не вызывает исключения " (очевидно,Math.Pow(-1,.5) даст проблемы и не находится в R в результате). Свойства N - "любое целое число" - в коде это может быть любое число, где Math.Пол != Математика.Потолок. Соединение этих двух есть соединение их свойств. Любое число, которое придерживается свойств R или N - в коде это будет любое число, которое не бросает исключение для создания или что математика.Пол != Математика.Потолок.

резюме

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


редактирование

N ⊆ R ?

давайте вернемся к идее свойств, так как это тема, которую я бы преследовал. Является ли N подмножеством R? Чтобы N было подмножеством R, свойства N должны удовлетворять все свойств R. список свойств должен быть точным. Чтобы представить числовое значение бесконечности, я бы предложил использовать класс, который содержит нулевое число int и нормальный знак int.

public class Infinite
{
 public int? Number { get; set; }
 public int Sign { get; set; }
}

что-то в этом роде. Число.Значение == значение null подразумевает бесконечность. Знак можно использовать для показа отрицательного (-1), +- (0), или положительный (1).

вернемся к N подмножеству R ситуации. Помимо свойств, перечисленных ранее, N также будет бесконечным.Число = = null и бесконечно.Sign == 0 в качестве границ для его свойств. Как и R. таким образом, N сможет удовлетворить граничное свойство. Далее будут свойства, определенные выше. Я вообще-то застрял здесь. Я не уверен, как доказать в коде, что каждое число, которое .Этаж. == Потолок не вызовет исключения. Однако, поскольку существует только 9 из этих типов супер множеств (рациональных, иррациональных, целых, реальных, сложных, мнимых, трансцендентальных, алгебраических, естественных), вы можете специально определить их взаимодействия в бесконечном масштабе, а затем использовать более простую реализацию для конечных сравнений.


Что именно вы собираетесь делать с ним. Вы не можете его перечислить.

Я думаю, что я рассматриваю его как потомок универсального набора.

Я думаю, я бы начал с другого конца

определите универсальный набор, где Ismember всегда true Тогда потомок, где IsMember истинен, если это представление натурального числа {1,2,3,4} является дальнейшим ограничением n

мысль в любом случае


это возможно с большим количеством ограничений, как и обработка символьных выражений.

вот небольшой пример:

class IntSet
{
    int m_first;
    int m_delta;

    public IntSet(int first, int delta)
    {
        m_first = first;
        m_delta = delta;
    }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();

        sb.Append('[');
        sb.Append(m_first);
        sb.Append(',');
        sb.Append(m_first + m_delta);
        sb.Append(',');
        sb.Append("...");
        sb.Append(']');

        return sb.ToString();
    }

    public IEnumerable<int> GetNumbers()
    {
        yield return m_first;

        int next = m_first;

        while (true)
        {
            next += m_delta;

            yield return next;
        }
    }
}