c# – 如何实现无限集类?

前端之家收集整理的这篇文章主要介绍了c# – 如何实现无限集类?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在设计一个离散数学类库,我不能想到实现一个 infinite set方法.

到目前为止,我有一个抽象的基类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,3}
Console.WriteLine(set2); //{3,5}

set1.UnionWith(set2);
Console.WriteLine(set1); //{1,3,5}

现在我想表示一个无限集.我有一个想法,从集合,InfiniteSet导出另一个抽象类,然后使用该库的开发人员将不得不从InfiniteSet派生来实现自己的类.我会提供常用的集合,如N,Z,Q和R.

但是我不知道如何实现Subset和GetEnumerator等方法 – 我甚至开始认为这是不可能的.您如何以实用的方式枚举无限集,以便您可以与另一个无限集相交/联合?如何在代码中检查N是R的一个子集?至于基数的问题..那可能是一个单独的问题.

所有这一切导致我的结论,我的想法实现无限集可能是错误的方式去.我非常感谢您的输入:).

编辑:要清楚,我也想表达无数的无限集.

Edit2:我认为重要的是要记住,最终的目标是实现ISet,这意味着任何解决方案都必须提供(应该的)方法来实现所有ISet’s methods,其中最有问题的是枚举方法和IsSubsetOf方法.

解决方法

不可能完全实现ISet< T>为无数的无限集.

这是一个证明(由伯特兰·罗素提供):

假设你已经创建了一个类MySet< T>这可以代表无数无限集.现在让我们考虑一些MySet< object>对象.

我们标记一个特定的MySet< object>,调用它的实例,“异常”如果:

instance.Contains(instance)返回true.

类似地,我们将实例标记为“normal”,如果:

instance.Contains(instance)返回false.

请注意,对于所有实例,这种区别是明确的.

现在考虑MySet< MySet< object>>>的实例称为悖论.

我们将矛盾定义为MySet< MySet< object>>其中包含MySet< object>的所有可能的正常实例.

悖论应该悖论(悖论)返回?

如果它返回true,那么悖论就是异常的,当它本身被调用时应该返回false.

如果它返回false,那么悖论是正常的,并且在调用本身时应该返回true.

没有办法实现Contains来解决这个悖论,所以没有办法完全实现ISet&T;对于所有可能的不可数的集合.

现在,如果您限制MySet< T>的基数,等于或小于连续体的基数(| R |),那么你将能够绕过这个悖论.

即使这样,您将无法实现包含或类似的方法,因为这样做将等同于解决停止问题. (请记住,所有C#程序的集合的基数等于| Z | <| R |.) 编辑 更彻底的是,这是对我断言“这样做相当于解决停顿问题”的解释. 考虑MySet< string>它由所有C#程序(作为字符串)组成,它们在有限的时间内停止(假设他们停止任何输入,是精确的).称它为悖论2.该集合是*递归枚举的“,这意味着你可以实现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方法已正确实施,那么您已经解决了停止问题.然而,我们知道这是不可能的,所以我们只能得出结论,即使是无限集,也不可能正确地实现包含.

您可能可以限制MySet< T>所有的工作类都是decidable sets.然而,然后,你仍然会遇到各种各样的问题,你的功能永远不会在有限的时间内停止.

例如,假设我们有一个称为Real的任意精确的真实类型,让我们让非哈尔丁成为MySet< Real>的一个实例.这包括Riemann Zeta功能的所有非平凡零(这是一个可判定的集合).如果您可以正确地实施IsProperSubsetOf on nonHalting返回有限的时间,通过所有复数的集合与实际的1/2(也是一个可判定的集合),那么你将赢得一个Millennium Prize.

猜你在找的C#相关文章