只能实现可计算双射函数的编程语言?


10

当且仅当是可计算双射函数时,是否存在可以实现(或表达)函数的编程语言(或逻辑)? ff:NNf


有人向我证明,不可能创建只接受终止程序的语言。由于您的问题非常相似,我想没有。
FUZxxl 2012年

1
似乎不可能有这样的编程语言,我想您可以尝试执行它,但是那样您将无法做诸如排序之类的简单事情,至少要使它变得非常复杂和痛苦就不可能了。
Luke Mathieson,2012年

@FUZxxl这不会捕获许多终止程序,实际上即使函数f(x)= 1也无法用这种语言表示。我也感觉到这种功能被总功能编程所捕获,因为每个功能都是总功能。
赵超

@FUZxxl,我认为这是不对的,但是必须限制这种语言。例如,与有限确定性自动机等效的语言将被保证终止,但其计算能力将受到极大限制。
jmite 2012年

@FUZxxl,这样的声明的细节很重要。设计每个程序都终止的编程语言很容易。设计一种可以表达每个可计算功能的语言是另一回事。
维杰D

Answers:


9

没有这样的语言。

但是,看看Boomerang。它是用于在字符串之间编写双射的语言。我不知道在一类地图中可表达的范围是多少,但是我敢肯定,如果您进行一点搜索,便可以找到答案。

合理地需要一种编程语言,即解释程序或编译器可以识别有效程序集,即它是可计算枚举的集。假设我们有一种编程语言,其有效程序集可计算地枚举,并且精确地实现了所有可计算双射。这意味着我们可以计算出所有可计算的双射(仅列举此编程语言中的所有有效程序),但这在下一个定理中是不可能的。NN

定理: 假设是可计算双射的可计算的序列。然后有一个不在序列中的可计算双射。f0,f1,f2,

证明。我们构造一个双射如下。为了定义值g 2 k g 2 k + 1 ,我们看f k2 k g:NNg(2k)g(2k+1)fk(2k)

  • 如果然后集2 ķ = 2 ķ + 12 ķ + 1 = 2 ķfk(2k)=2kg(2k)=2k+1g(2k+1)=2k
  • 如果然后集2 ķ = 2 ķ2 ķ + 1 = 2 ķ + 1fk(2k)2kg(2k)=2kg(2k+1)=2k+1

显然,对于每不同于˚F ķ因为2 ķ ˚F ķ2 ķ 。此外,g是可计算的,并且是双射,因为它是自己的逆。QED。kNgfkg(2k)fk(2k)g


为什么你甚至不需要这2 ķ + 1个把戏?使用ķ = ˚F ķķ + 1就足够了。2ķ2ķ+1个Gķ=Fķķ+1个
FUZxxl 2012年

@FUZxxl:如果您使用则结果函数不是排斥的Fķķ+1个
Vor 2012年

您需要确保是双射的。G
Andrej Bauer

最初的说法是错误的,文献中有许多这样的语言。
纳撒尼尔(Nathaniel)

另一方面,您的证明似乎合法。也许我有点困惑。我需要仔细阅读Axelsen和Glück的论文(请参阅我的答案),以了解此处的情况。
纳撒尼尔(Nathaniel)
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.