如何实现无限集类?

Dan*_*iel 11 c# set-theory set

我正在为离散数学设计一个类库,我想不出一种实现无限集的方法.

到目前为止我所拥有的是:我有一个抽象基类Set,它实现了接口ISet.对于有限集,我派生出一个有限集类,它实现了每个集合方法.我可以这样使用它:

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}
Run Code Online (Sandbox Code Playgroud)

现在我想代表一个无限集.我有从set,InfiniteSet派生另一个抽象类的想法,然后使用该库的开发人员必须从InfiniteSet派生来实现他们自己的类.我会提供常用的集合,例如N,Z,Q和R.

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

所有这些使我得出结论,我实现无限集的想法可能是错误的方法.我非常感谢你的意见:).

编辑:为了清楚起见,我也想代表无数的无限集.

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

Mic*_*zyk 6

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

这是一个证明(由Bertrand Russell提供):

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

我们标记一个特定的MySet<object>,称之为instance" 异常 ",如果:

instance.Contains(instance) 返回true.

同样,如果符合以下条件,我们会标记instance为" 正常 "

instance.Contains(instance) 返回false.

请注意,这种区别是为所有人明确定义的instance.

现在考虑一个MySet<MySet<object>>被调用的实例paradox.

我们定义paradoxMySet<MySet<object>>包含所有可能的正常实例MySet<object>.

应该paradox.Contains(paradox)返回什么?

如果它返回true,那么paradox异常的,应该false在自己调用时返回.

如果它返回falseparadox正常的,并且应该true在自己调用时返回.

没有办法实现Contains解决这个矛盾,所以没有办法完全实现ISet<T>所有可能的不可数集.


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

即使这样,你也无法实现Contains或类似的方法,因为这样做相当于解决了暂停问题.(请记住,所有C#程序的集合的基数等于| Z | <| R |.)

编辑

为了更加彻底,这是对我的断言的解释,"这样做将等同于解决暂停问题."

考虑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]));
    }
}
Run Code Online (Sandbox Code Playgroud)

编译上面的程序,并将其作为输入传递给自己.怎么了?

如果您的Contains方法正确实施,那么您已经解决了暂停问题.但是,我们知道这是不可能的,所以我们只能得出结论Contains,即使对于可数无限的集合,不可能正确实现.

您可以限制您的MySet<T>班级适用于所有可判定的集合. 然而,你仍然会遇到各种各样的问题,你的函数永远不会在有限的时间内停止.

作为一个例子,让我们假设我们有一个被调用的任意精度实数类型Real,让我们让它nonHalting成为MySet<Real>包含Riemann Zeta函数的所有非平凡零点的实例(这是一个可判定的集合).如果你能正确地实现IsProperSubsetOfnonHalting时通过与实部1/2(也可判定一组)设定的所有复杂的数字在有限的时间后返回,那么你会赢得一个千禧年大奖.