我正在研究一个可以改进的事件处理框架,如果我有一种有效的方法来使用序数进行计算。
在 Java 语法中,我正在寻找:
class Ordinal {
static int compare(Ordinal o1, Ordinal o2) { }
static Ordinal suc(Ordinal o) { }
static Ordinal add(Ordinal o1, Ordinal o2) { }
static Ordinal mul(Ordinal o1, Ordinal o2) { }
static Ordinal pow(Ordinal o1, Ordinal o2) { }
static Ordinal omega() { }
static Ordinal zero() { }
}
到目前为止,我想到的唯一方法是将可能的操作逐字表示为数据,这很像将整数表示为链表,因此感觉不太好。
有谁知道这样的事情?
更多信息:
序 数是一个数学概念,通常侧重于良序集的概念,但我希望将它们用作产生“不断变大”的数字的一种方式。
例如,1, 2, 3 ... 都小于 ω。那么 ω + 1, ω + 2, .... 都小于 2ω, 小于 3ω, ... 都小于 ω², 小于 ω³ ... 都小于 ω^ω, 等等上。这就是为什么有效地表示它们似乎很棘手......简单的位置值表示很快就会用完,然后一次又一次地用完。
我认为我想在我的代码中使用序数的原因是它们可以作为一种限制递归计算深度的方法,递归计算可以变得非常深、无限深和“超越”(如in,大于 ω)。考虑一个递归函数列表,其中第 i 个函数的深度为 i,然后是一个对列表进行折叠的函数......它的深度是 ω,但是我们可以再增加一个步骤,然后再增加一个步骤,得到 ω + k,因此另一个折叠得到 2ω,我们可以将此过程推广到所需的 ω²,依此类推。
现在,我想用序数计算的原因是,如果你用既尊重拓扑顺序又尊重深度的序数来标记 DAG 的节点,你可能想要做的一件事是执行一种访问节点的图搜索按其序号标签的递增顺序。我不能 100% 确定这就是我希望我的代码工作的方式,但这是我正在考虑的一种方法,所以我想看看走这条路是否合理。它看起来越来越像我应该重新考虑我的方法,在这种情况下,这个问题可能没有实际意义,但对于好奇心来说仍然很有趣。