全部功能编程的局限性是什么?


19

整体功能编程的局限性是什么?它不是图灵完备的,但仍支持可能程序的很大一部分。是否有可以用图灵完备的语言而不是全部功能的语言编写的重要构造?

可以完全静态分析以全部功能语言编写的程序,而图灵完备语言的静态分析却受制于停顿问题,这是否正确?我的意思并不是说在总功能语言中可以静态确定一切,因为有些事情只能在运行时知道,但是我的意思是理论上可以对以理想的总功能编程语言编写的程序进行分析,以便所有理论上可以静态确定,也可以静态确定。还是在无法使静态分析完成的全部功能语言中仍然存在无法确定的问题?无论使用哪种语言编写,某些问题始终是无法确定的,但是我对继承给该语言的此类问题很感兴趣,

Answers:


16

这取决于总的功能语言

这个答案听起来像是解决方案,但是没有什么比这更具体的了。毕竟,请考虑您感兴趣的重要可决定程序。用您喜欢的图灵完备语言编写一个程序来解决它。由于问题是可以确定的,因此您的程序将在所有输入上停止。

(可以说,一个无法确定的问题可能会有有趣的程序,但人们无法使用,因为他们永远无法等待足够长的时间才能知道答案。)

现在,定义一种新语言,使其仅具有一个有效的输入程序:您刚刚编写的程序,其语义与以前相同。它肯定是总数,因为写入其中的所有程序的所有输入(其中只有一个)总是终止。

这个便宜的技巧实际上是有用的:例如,语言Coq是一种总的功能语言,除非有证明它终止的程序,否则它不会检查程序类型。(如果您放弃该要求,那将是图灵完备的,因此唯一的障碍是找到终止的证明。)

我不确定您的意思是“理论上可以静态确定的所有内容都可以静态确定”;从听起来上来说是正确的。尽管如此,总的语言并不是天生容易分析的。您知道没有什么不同,这是一个有用的事实,但是输入和输出之间的关系仍然很复杂。(特别是,仍然有无限多种可能的输入,因此即使从理论上讲,您也无法穷尽所有输入。)


感谢您的回答。因此,总体有所帮助,但这仍然是一个非常困难的问题。我的意思是“理论上可以静态确定的一切都可以静态确定”是指,如果您有足够的资源来分析输入和输出之间的所有关系,是否有可能(极其困难)? 。还是限制它的根本原因?就像赖斯定理证明的那样,部分函数就是这种情况。还是我误解了赖斯定理?
Matthijs Steen 2012年

我认为这可能取决于您所说的“关系”。特别是,如果您只是说“输入A到输出B”,这在整个功能语言中都是可以轻易确定的。只需运行该程序。但是,您可能对那些涉及无限类输入的分析感兴趣。
保罗·斯坦斯弗

(哎呀;不小心打回车)...但是这又开了一个愚蠢的把戏,因为如果我想问:“对于某些人来说X(identity X)图灵机会停止吗?” ,我可以问有关身份函数的不确定的问题。当然,这似乎不是关于 identity,但是您如何定义“关于”?
保罗·斯坦佛

是的,我想知道它是否适用于某个定义的所有可能的输入值,而不适用于单个输入。因此,如果我对您的理解正确,则意味着无论使用哪种类型的编程语言,总会有一些不确定的问题?尽管可以通过阻止问题首先发生来解决一些不确定的问题,例如暂停问题的全部功能语言?因为您对身份功能的疑问是否可以用全部功能语言来确定?
Matthijs Steen 2012年

是; 该问题的修改版本,其中“ Turing Machine”被“保修期满后失效,Turing Machine失效”代替,可以轻松解决。出于这些目的,当检查程序充满不确定性时,停止问题是不确定性问题的首选示例,这有点麻烦。
Paul Stansifer

16

整体功能编程的局限性是什么?它不是图灵完备的,但仍支持可能程序的很大一部分。是否有可以用图灵完备的语言而不是全部功能的语言编写的重要构造?

LLL

  1. LLLL是一致的。假设您可以进行算术运算,这就是Goedel定理所排除的内容。因此,我们知道我们无法使用全部功能语言编写自解释器。

  2. 但是,另一方面,总语言表达能力的限制本质上是数学本身表达能力的限制。例如,在Coq(证明助手)中可定义的功能是可以证明使用ZFC可计算的功能,其中有许多不可访问的基数。因此,从本质上讲,您可以证明所有可以满足工作数学家满意的功能都可以在Coq中定义。

  3. 反面是数学难!因此,总的语言是“完全可分析的”是不容易的-即使您知道某个函数终止,您仍可能必须做很多创造性的工作才能证明它具有所需的属性。例如,仅知道一个从列表到列表的函数是总数,就不会证明它是排序函数。


感谢您的回答。我已经在Lambda Ultimate网站博客上阅读了有关此问题的帖子,但有一些评论者指出,尽管不可能将自己的评估器作为可明确构造的常规术语,但有可能创建一个能够正常运行的自我评估工具评估师有一些技巧。因此,我想知道,是否存在一些绕道而行的功能无法解决(或近似)的问题?
Matthijs Steen 2012年

我要说,自我评价不算什么问题,因为自我评价因语言而异。无论使用X语言还是Y语言解决问题,“用X语言评估程序”问题都是相同的问题。特别是,如果X语言是一种整体功能语言,则该问题可以用某种整体功能语言解决。,使用与我以前相同的愚蠢技巧。
保罗·斯坦佛

尼尔(Neel),似乎比证明一种整体语言不能支持自己的解释器要容易得多。我是在误会你吗 通过简单的对角线化,任何具有不固定点功能的语言都不能支持其自己的解释器(无论它是否支持算术)。该论点由Conor McBride在此处阐述:mail.haskell.org/pipermail/haskell-cafe/2003-May/004343.html
Tom Ellis,

@TomEllis:我的论点与Conor的论点基本相同。实际上,当他称其为“ Epimenides / Cantor / Russell / Quine / Godel / Turing论点”时,他的帖子(具有Conor的典型机智)已经做出了这一观察。
Neel Krishnaswami 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.