17

范畴论和抽象代数处理函数与其他函数结合的方式。复杂性理论处理一个函数的计算难度。对我来说很奇怪,我还没有看到有人将这些研究领域结合起来,因为它们看起来很自然。有没有人这样做过?


作为一个激励性的例子,让我们看一下幺半群。众所周知,如果一个运算是一个幺半群,那么我们可以并行化这个运算。

例如在 Haskell 中,我们可以简单地定义加法是整数上的幺半群,如下所示:

instance Monoid Int where
    mempty = 0
    mappend = (+)

现在,如果我们想计算 0 到 999 的总和,我们可以按顺序执行,如下所示:

foldl1' (+) [0..999]

或者我们可以并行进行

mconcat [0..999] -- for simplicity of the code, I'm ignoring that this doesn't *actually* run in parallel

但是并行化这个幺半群才有意义,因为 mappend 在恒定时间内运行。如果不是这样呢?例如,列表是一个幺半群,其中 mappend 不会运行不固定的时间(或空间!)。我猜这就是为什么 Haskell 中没有默认的并行 mconcat 函数的原因。最好的实现取决于幺半群的复杂性。


似乎应该有一种方便的方式来描述这两个幺半群之间的差异。然后,我们应该能够用这些差异注释我们的代码,并让程序根据幺半群的复杂性自动选择要使用的最佳算法。

4

3 回答 3

10

我并不声称自己是这些主题的专家,但我也许可以对这个想法有所了解。

让我们首先考虑范畴论。范畴论是对数学结构的高水平研究。范畴的概念很笼统,许多数学对象构成范畴。范畴论最初被认为是极其纯粹和抽象的,但由于这些东西经常出现在数学中,结果证明它在计算机科学甚至量子力学等应用学科中有很多用途。Monads 被证明在推理函数程序的语义方面非常有用,这些语义通常用指称表示(因此不强制任何类型的计算顺序,只是结果)。由此也意识到monad也是一个非常好的设计模式用于编写函数式程序,它的实用性导致它在 Haskell 的设计中非常突出(即 do 表示法等)。Functors、Applicatives、Monoids,都在后来作为对象不如 monads 强大,但因此也更具应用性(不是双关语!)。

然而,范畴论以更一般的方式研究这类结构,事实证明这与数学(和物理等)的许多领域相关。作为非专家,目前尚不清楚这有多少与复杂性理论有关,但让我们试一试。

复杂性理论关注计算的可行性。图灵和其他人已经表明,有些函数通常是不可计算的(例如停机问题、忙碌的海狸问题等),但原则上特定计算有多容易的问题通常是一个更难的问题。您可能知道,算法(可以表示为图灵机)可以根据其渐近运行时间归类为复杂性类。已经确定了许多复杂性类别(请参阅The Complexity Zoo),但对这些类别的结构知之甚少。著名的P = NP问题显示了推理复杂性是多么困难。

从对复杂性类的性质以及证明它们之间关系的难度的直觉来看,我认为在复杂性类中建立类别会很棘手。显然图灵机的集合形成了一个范畴,但是 O(n) 中的机器集合呢?还是 P 中的机器集?对于复杂性专家来说,这可能是一个很好的研究方向,但也可能不是!就个人而言,我不能说没有更多的工作。

现在让我们考虑您在 Monoid 和并行化策略中的复杂性示例。如果第二部分看起来与第一部分关系不大,那是因为我认为这些是非常不同的概念。首先是类别和复杂性的数学,其次是某些设计模式中并行化算法的细节。

如果我们知道某个类型是 Monoid,我们可以推断使用它的复杂性是什么?这是来自的类定义Data.Monoid

class Monoid a where
    mempty  :: a
    mappend :: a -> a -> a
    mconcat :: [a] -> a
    mconcat = foldr mappend mempty

当然,我们不能说复杂性,因为我们所知道的只是类型,正如您所猜测的那样。mconcat文档对Data.Monoid中的默认实现有这样的说法:

    -- ^ Fold a list using the monoid.
    -- For most types, the default definition for 'mconcat' will be
    -- used, but the function is included in the class definition so
    -- that an optimized version can be provided for specific types.

我要说明的一点是,这mconcat不一定能从其他操作的复杂性中概括出来。在许多情况下,很难证明不存在某些更快的算法。mconcat在这种情况下可以手动实现。

您还提到自动定义并行策略。Haskell 当然允许定义各种不同的策略,其中许多有用的策略已经在Control.Parallel.Strategies. 例如, parList 将策略并行应用于列表的每个元素:

parList :: Strategy a -> Strategy [a]
parList strat []     = ()
parList strat (x:xs) = strat x `par` (parList strat xs)

由此可以定义一个并行映射函数。

parMap :: Strategy b -> (a -> b) -> [a] -> [b]
parMap strat f xs = map f xs `using` parList strat

using :: a -> Strategy a -> a
using x s = s x `seq` x

请注意,这允许分离实现和并行化。我不认为这种概念可以很容易地自动化,尤其是仅从描述单个算法复杂性的注释中。

综上所述,范畴论有可能成为未来复杂性研究的有用工具。但是我不认为这可能会导致并行化策略的自动生成。

于 2012-07-31T09:09:25.510 回答
6

从表面上看,复杂性理论家已经做了范畴论式的事情,他们只是用他们自己的语言来表达它。例如,复杂性类别 NP 是一个类别,其中对象是 NP 语言,态射是多项式时间约简。那么一个完全问题就是这个范畴的一个初始对象,所有的NP完全问题都是同构的。正如维克的回答那样,将图灵机视为对象并不是很合理。这主要是因为图灵机是多么的复杂(它们是许多不同模型的图灵机,对于相同的问题具有完全不同的时间和空间复杂性)。但是范畴论的论文思想,即范畴的主要兴趣在于态射,告诉我们态射应该是算法。

另一种观点是层次结构。复杂性类构成了一个包含在内的poset类别,并且有一些很好的限制对象,如P、PSPACE、NC、AC等。

当然,范畴论如何帮助我们证明复杂性理论中的定理,以及通过范畴论解决问题是否比解决原始问题更容易,目前还不清楚。例如,我认为从复杂性类的复杂性类别到组类别的非平凡函子的存在是一个非常具有变革性的结果。它将有可能分离复杂性类别,这在该领域中当然是非常困难的。

于 2013-06-06T22:41:52.140 回答
0

快速谷歌搜索显示一篇论文:

重新审视安全递归:降低复杂性的分类语义和类型系统

我还记得 Japaridze 关于多项式时间算术的作品,请参阅http://arxiv.org/abs/0902.2969

我认为您可以从那里开始并参考参考资料。

于 2012-09-01T18:07:59.973 回答