【问题标题】:How can I implement an infinite set class?如何实现无限集类?
【发布时间】:2012-07-24 11:19:26
【问题描述】:

我正在为离散数学设计一个类库,但我想不出一种方法来实现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, 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's methods 的方法,其中最成问题的是枚举方法和 IsSubsetOf 方法。

【问题讨论】:

  • 使用yield return msdn.microsoft.com/en-us/library/9k7k7cf0.aspx 创建无限集非常简单
  • @asawyer 我真的不明白这与这里的任何问题有什么关系,除了实施枚举 - 这仍然留下了“实际”实施它的问题。
  • 使用yield return 创建一个可数无限集很容易。
  • @Daniel Michael 说的。对不起,如果我误解了这个问题。
  • 根据定义,你不能枚举一个不可数的集合。如果您愿意放弃枚举,那么实现该集合应该是微不足道的(只需有一个检查成员资格的谓词。交叉点和两个谓词,以及联合或它们)。

标签: c# set set-theory


【解决方案1】:

对于不可数的无限集合,不可能完全实现ISet&lt;T&gt;

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

假设您创建了一个类MySet&lt;T&gt;,它可以表示一个不可数的无限集。现在让我们考虑一些MySet&lt;object&gt; 对象。

我们标记一个特定的MySet&lt;object&gt;,称它为instance,“异常”如果:

instance.Contains(instance) 返回真。

同样,如果:

instance.Contains(instance) 返回 false。

请注意,这种区别对于所有instance 都是明确定义的。

现在考虑一个名为paradoxMySet&lt;MySet&lt;object&gt;&gt; 实例。

我们将paradox 定义为MySet&lt;MySet&lt;object&gt;&gt;,其中包含MySet&lt;object&gt; 的所有可能的正常 实例。

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

如果它返回true,那么paradox异常,并且在调用自身时应该返回false

如果它返回false,那么paradox正常,并且在调用自身时应该返回true

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


现在,如果您将MySet&lt;T&gt; 的基数限制为等于或小于连续统的基数 (|R|),那么您将能够绕过这个悖论。

即便如此,您也无法实现Contains 或类似方法,因为这样做相当于解决停机问题。 (请记住,所有C# 程序的集合的基数等于|Z|

编辑

为了更彻底,这里是对我的断言的解释,即“这样做等同于解决停机问题。”

考虑由所有 C# 程序(作为字符串)组成的 MySet&lt;string&gt;,它们在有限的时间内停止(假设它们对任何输入都停止,准确地说)。叫它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&lt;T&gt; 类为所有 decidable sets. 工作但是,您的函数仍然会遇到各种问题永远不会在有限的时间内停止时间。

例如,假设我们有一个名为Real 的任意精度实数类型,让nonHalting 成为MySet&lt;Real&gt; 的一个实例,其中包括黎曼 Zeta 函数的所有非平凡零(这是一个可判定的集合)。如果您可以在nonHalting 上正确实现IsProperSubsetOf 以在通过实部为1/2 的所有复数集合(也是可判定集合)时在有限时间内返回,那么您将赢得Millennium Prize.

【讨论】:

  • "现在,如果您将 MySet 的基数限制为等于或小于连续统的基数 (|R|),那么您将能够绕过这个悖论。 "我愿意这样做(我不得不这样做,不是吗:P?)。但是 IsSubsetOf 如何等同于解决停机问题?
  • 我会尝试找出一个例子。
  • @Daniel,集合由指标函数定义。 (上面的instance.Contains(object)。)计算“ab 的一个子集”等价于计算“a.Contains 的返回值小于b.Contains”。我认为从这里很明显,检查像这样的函数的可能返回值是停止问题。
【解决方案2】:

这可能有很多限制,就像符号表达式处理一样。

这是一个小例子:

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;
        }
    }
}

【讨论】:

    【解决方案3】:

    表示不可数的无限集

    让我们在实践中如何完成此声明。例如,当询问天气时,集合 A 是集合 Z(正整数)的子集,主题不是 Z。不分析 Z 中的每个数字。分析的是所讨论的集合 A。因为无法将 Ak(A sub k,其中 k 是 1 和 |A| 之间的数字)与 Z 的每个值(无限)进行比较,所以 A 的每个值都必须是与构成 Z 的属性相比。如果 A 中的每个值都满足 Z 的属性,则 A 是 Z 的子集。

    如何在代码中表示 R union N

    与上述相同的过程。 R 的属性是“任何实数” - 在代码中这可能是“任何不引发异常的双精度数”(显然 Math.Pow(-1,.5) 会出现问题,因此不在 R 中)。 N 的属性是“任何整数”——在代码中,它可以是 Math.Floor != Math.Ceiling 的任何数字。这两者的结合就是它们属性的结合。任何符合 R 或 N 属性的数字 - 在代码中,这将是任何不会引发异常以创建 Math.Floor != Math.Ceiling 的 的数字。

    总结

    要表示不可数的无限集,请使用它们的属性而不是它们的值。


    编辑

    N ⊆ R ?

    让我们回到属性的想法,因为这是我要追求的主题。 N是R的子集吗?如果 N 是 R 的子集,那么 N 的属性必须满足 R 的 所有 属性。属性列表需要准确。为了表示无穷大的数值,我建议使用一个包含一个可为空的 int 数和一个普通的 int 符号的类。

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

    类似的东西。 Number.Value == null 意味着无限。符号可用于显示负数 (-1)、+- (0) 或正数 (1)。

    回到 R 的 N 个子集的情况。除了前面列出的属性之外,N 还具有 Infinite.Number == null 和 Infinite.Sign == 0 作为其属性的界限。与 R 一样。因此,N 将能够满足边界属性。接下来是上面定义的属性。我真的被困在这里了。我不确定如何在代码中证明 .Floor == .Ceiling 的每个数字都不会导致异常。但是,由于这些类型的超集只有 9 种(有理、无理、整数、实数、复数、虚数、先验、代数、自然),您可以专门定义它们在无限尺度上的相互作用,然后使用更简单的有限实现比较。

    【讨论】:

    • 这解决了联合问题,在我看来这是最简单的问题,但仍然不是 N 是 R 的子集吗?问题,或者枚举问题。不过,我很欣赏(写得很好的)答案:)。
    【解决方案4】:

    你打算用它做什么。 你不能枚举它。

    我想我把它当作全集的后代。

    我想我会从另一端开始

    定义一个 Ismember 始终为真的通用集 然后是 IsMember 为真的后代,如果它是自然数的表示 {1,2,3,4} 是对 N 的进一步限制

    一个想法

    【讨论】:

      【解决方案5】:

      你将不得不概括你所说的 Set 的意思。

      如果您将拥有一个无限集,您将无法获得有意义的枚举,因此您不会使用枚举操作来定义集合操作。

      如果您根据bool IsMember(f obj) 方法定义Set&lt;f&gt;,它可以用于无限集。

      您将两个集合的并集或交集定义为两个集合的 IsMember 方法的逻辑与或或。

      【讨论】:

      • 我不确定我是否理解 - 鉴于 R 的 IsMember 和 N 的 IsMember,您如何确定 N 是 R 的子集。您如何将它们相交或合并?
      • 取决于是否输入了 R。如果 R 是自然数,则 N union R 是 N,N intersect R 是 R。
      • @TonyHopkinson 我说的是如何在代码中做到这一点:P .. 我知道如何在纸上做到这一点。而且,R 不仅仅包含自然数 - 它还有无数个非自然数。
      • @Daniel -- 交集和联合很简单: (A union B).IsMember(f) = (A.IsMember(f) || B.IsMember(f)); (A 交集 B).IsMember(f) = (A.IsMember(f) && B.IsMember(f))。对于无限集来说,测试 A 是 B 的子集并不容易(事实上,在另一个答案中显示的最一般情况下是不可能的);您必须象征性地表示 IsMember 谓词并证明 A 的谓词暗示 B。
      • @Daniel。我也是,这必须是符号和规则,就像数学一样。没有人通过枚举 N 的每个成员并查看它是否是 R 的成员来证明 N 是 R 的子集,他们有没有....
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 2022-06-16
      • 2017-09-06
      • 2019-07-06
      • 2013-08-03
      • 1970-01-01
      • 2014-10-25
      相关资源
      最近更新 更多