简而言之:算法是给定问题具有解决方案的建设性证明的建设性部分。该定义的动机是程序与证明之间的Curry-Howard同构,认为程序只有在解决问题后才有兴趣,但可以证明是有兴趣的。该定义允许更多抽象,并为可能涉及的领域(例如,有限性)打开了一些大门。
警告。我正在尝试找到适当的正式方法来回答这个问题。我确实认为这是必要的,但是到目前为止,似乎没有一个回复的用户(包括我本人,并且有些人在其他帖子中或多或少明确了此信息),没有适当的背景来适当地开发与以下内容相关的问题:构造数学,证明理论,类型理论以及证明与程序之间的Curry-Howard同构等结果。我在这里会尽我所能,无论我相信(或相信)拥有什么知识片段,我也太清楚这个答案的局限性。我只希望给出一些我认为答案应该是什么样的提示。如果您发现任何形式上明显(正式)存在错误的地方,请立即在评论中或通过电子邮件发送给我。
确定一些问题
考虑算法的标准方法是声明算法是某些计算设备的任意有限指定程序,包括那些不受内存限制的程序。语言也可以是计算机机器语言。实际上,为图灵完整的计算设备考虑所有程序就足够了(这意味着没有内存限制)。从某种意义上讲,算法必须以某种形式表达,该形式必须依赖于其解释细节(甚至是理论上)的细节,因为所有内容都取决于某种编码。但是,由于它将计算所有要计算的内容,因此它将以某种方式包括所有算法,直至编码为止。
π
π,可能在几乎所有数学意义上都是如此。但这将需要更精确的定义。
因此,真正的问题是要知道什么是有意义的算法。答案是有意义的算法是解决问题的算法,逐步解决该问题的“解决方案”,“答案”。如果算法与要解决的问题相关联,则该算法很有趣。
因此,给定一个正式问题,我们如何获得解决该问题的算法。无论是显式的还是隐式的,算法都与存在该问题的解决方案的想法相关联,这可以证明是正确的。我们的证明技术是否准确是另一回事,但我们至少尝试说服自己。如果您将自己限制在建设性数学上,而这实际上是我们要做的(并且对于大多数数学而言,这是一个非常可接受的公理约束),则证明解决方案存在的方法是通过证明实际上可以证明构造的证明步骤。代表解决方案,可能包括建立正确性的其他步骤。
所有程序员都这样想:如果我以某种方式摆弄数据,那么我会得到这个小部件,因为芝麻定理,该小部件具有正确的属性,并且运行此foo保留的转换,便得到了所需的答案。但是这种证明通常是非正式的,我们无法得出所有细节,这也解释了为什么卫星试图绕火星在地下运行(其中包括其他原因)。我们做了很多推理,但实际上我们只保留构建解决方案的建设性部分,我们用计算机语言描述它是解决问题的算法。
有趣的算法(或程序)
所有这些都是为了引入以下想法,这些想法是当前许多研究的对象(我不是其中的专家)。这里使用的“ 有趣算法 ” 的概念是我的,它是非正式的占位符,用于更精确的定义。
一个有趣的算法是给定问题具有解的建设性证明的建设性部分。这意味着证明必须实际显示解决方案,而不是简单地证明其存在(例如通过矛盾)。有关更多详细信息,请参见数学中的直觉逻辑和建构主义。
当然,这是一个非常严格的定义,只考虑了我所谓的有趣算法。因此,它几乎忽略了所有这些。但是我们所有关于算法的教科书也是如此。他们试图只教一些有趣的。
给定问题的所有参数(输入数据),它告诉您如何逐步获取指定的结果。一个典型的例子是方程的解析度(名称算法实际上是从波斯数学家MuḥammadibnMūsāal-Khwārizmī的名字衍生而来的,他研究了一些方程的解析度)。证明的某些部分用于确定算法中计算出的某些值确实具有某些属性,但是这些部分无需保留在算法本身中。
当然,这必须在正式的逻辑框架内进行,该框架确定使用哪些数据进行计算,允许使用哪些基本计算步骤以及使用哪些公理。
回到您的阶乘示例,它可以被解释为一种算法,尽管它是微不足道的。正常阶乘函数对应于以下证明:给定某种算术框架,给定整数n,存在一个数字,该数字是前n个整数的乘积。这非常简单,阶乘计算也是如此。其他功能可能更复杂。
现在,如果您决定对阶乘进行制表(假设可以),这并非对所有整数都适用(但对于某些有限域的值可能适用),则您要做的就是通过定义a为变量,从而在您的公理中包括阶乘的存在。新公理为其每个整数提供值,因此您不再需要证明(因此无需计算)任何东西。
但是公理系统应该是有限的(或至少是有限定义的)。阶乘的值无穷大,每个整数一个。因此,如果您对无限函数进行公理化(即在无限域上定义),那么您将为有限公理系统带来麻烦。这实际上是无法对所有整数实现可能要进行的表查找的事实,从而进行了计算转换。这将消除通常对算法的有限性要求(但是是否像经常提出的那样严格?)。
您可以决定使用有限定义的公理生成器来处理所有情况。这或多或少等于在您的算法中包括标准阶乘程序以根据需要初始化数组。这被程序员称为记忆。实际上,这是您最接近预先计算表的等效项。可以理解,它具有一个预先计算的表,但实际上该表实际上是在需要时以惰性评估模式创建的。此讨论可能需要更多的正式注意。
您可以根据需要定义原始操作(与正式系统保持一致),并在算法中使用时将选择的任何成本分配给它们,以进行复杂性或性能分析。但是,如果实际实现您的算法的具体系统(例如计算机或大脑)无法遵守这些成本指标,那么您的分析可能会很有趣,但对于现实世界中的实际使用却毫无价值。
21000
哪些程序很有趣
这种讨论应该更恰当地与诸如程序和证明之间的Curry-Howard同构之类的结果联系起来
。如果任何程序实际上是某物的证明,则按照上述定义,任何程序都可以解释为有趣的程序。
但是,据我(有限的)理解,这种同构仅限于可以在某些适当的类型系统中很好地键入的程序,其中类型对应于公理理论的命题。因此,并非所有程序都可以被视为有趣的程序。我的猜测是,从这个意义上讲,一种算法应该可以解决问题。
这可能不包括大多数“随机生成”的程序。
这也是什么是“有趣的算法”的开放定义。任何可以被视为有趣的程序都是如此,因为有一个确定的类型系统使其变得有趣。但是,到目前为止尚未可打字的程序可以使用更高级的打字系统来打字,从而变得有趣。更准确地说,它总是很有趣,但是由于缺乏适当的类型系统的知识,我们无法知道。
然而,已知的是,并不是所有的程序都分型,因为它是已知一些lambda表达式,例如实现Y组合,不能在声音类型的系统类型。
这种观点仅适用于可以与某些公理证明系统直接相关的编程形式主义。我不知道如何将其扩展到诸如Turing Machine之类的低层计算形式主义。但是,由于算法和可计算性通常是对问题和解决方案进行编码的游戏(想想用lambda演算编码的算术),因此可以认为,任何形式上可以显示为算法编码的正式定义计算也是一种算法。这样的编码可能只使用了诸如图灵机之类的低级形式主义所能表达的很小一部分。
该方法的一个兴趣在于,它给出了一种算法概念,该概念更加抽象并且与实际编码问题无关,与计算域的“物理可表示性”无关。因此,例如,只要存在一种计算合理的使用方式,就可以考虑使用无限对象的领域。