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


10

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


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

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

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

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

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

Answers:


9

没有这样的语言。

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

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

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

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

  • 如果然后集克(2 ķ )= 2 ķ + 1和克(2 ķ + 1 )= 2 ķ,fk(2k)=2kg(2k)=2k+1g(2k+1)=2k
  • 如果然后集克(2 ķ )= 2 ķ和克(2 ķ + 1 )= 2 ķ + 1。fk(2k)≠2kg(2k)=2kg(2k+1)=2k+1

显然,对于每,克不同于˚F ķ因为克(2 ķ )≠ ˚F ķ(2 ķ )。此外,g是可计算的,并且是双射,因为它是自己的逆。QED。k∈Ngfkg(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.