问题 如何确定语言是递归还是递归可枚举?


我必须确定一种语言(例如L = {a ^ n b ^ m c ^ s | 0 <= n <= m <= s})是否是常规的,无上下文的,递归的,递归可枚举的或者都不是。

我知道如何确定一种语言是否规则(找到有效的DFA或正则表达式)或无上下文(找到一个有效的PDA或无上下文语法);我知道递归语言有一个总是停止的图灵机,并且一个递归可枚举的语言有一个可能不会停止的图灵机。

所以问题是:是否有一个快速的标准来确定语言是递归还是递归可枚举或两者都没有?例如,我不需要构建一个PDA来理解语言是无上下文的,我不能通过它需要一个堆栈来看待它;有没有类似的快速解决问题的方法(希望能省去构建图灵机的麻烦)?


1421
2018-02-16 17:58


起源



答案:


没有结构方法来检查语言是递归还是递归可枚举。实际上有一个非常酷的证据表明,对于任何能够识别递归语言的自动机,至少有一种RE语言不在R中,自动机也可以接受;它是用于显示存在不可判定问题的对角化参数的变体。

你证明一种语言的主要方式是RE而不是R是证明语言在RE中(也许是通过为它定义TM),然后减少RE中的已知问题而不是R来解决该问题。例如,如果您可以通过将其转换为问题实例来证明停止问题的任何实例都可以解决,那么您知道它不能具有递归解决方案,并且如果您使用TM进行后续操作你知道语言在RE中的语言。在RE中你有一种语言但不是R.


5
2018-02-16 18:51



这肯定不是我希望的答案:(虽然它澄清了我的一些疑虑,所以,谢谢!所以,如果你必须解决我在开始时写的例子,你将如何进行(知道它不是上下文-自由)? - Jacob
@ Jacob-你确定它不是没有背景的吗? - templatetypedef
很确定,是啊..抽水引理应该排除它,我也找不到可行的语法。 - Jacob
@雅各布 - 好的,很酷。关于如何检查R或RE-R中的某些内容,并没有严格的规则,但请记住R是一种非常强大的语言类。大多数涉及计数的事情都在R中,一个好的经验法则是,如果你能想到一个简单的计算机程序来解决它,那么它就在R中。在这种情况下,你能编写一个程序来检查是否有正确的字符串条件坚持? - templatetypedef
是的,我想这会相当容易..所以你认为说它在R中是一个很好的猜测,对吗? - Jacob


答案:


没有结构方法来检查语言是递归还是递归可枚举。实际上有一个非常酷的证据表明,对于任何能够识别递归语言的自动机,至少有一种RE语言不在R中,自动机也可以接受;它是用于显示存在不可判定问题的对角化参数的变体。

你证明一种语言的主要方式是RE而不是R是证明语言在RE中(也许是通过为它定义TM),然后减少RE中的已知问题而不是R来解决该问题。例如,如果您可以通过将其转换为问题实例来证明停止问题的任何实例都可以解决,那么您知道它不能具有递归解决方案,并且如果您使用TM进行后续操作你知道语言在RE中的语言。在RE中你有一种语言但不是R.


5
2018-02-16 18:51



这肯定不是我希望的答案:(虽然它澄清了我的一些疑虑,所以,谢谢!所以,如果你必须解决我在开始时写的例子,你将如何进行(知道它不是上下文-自由)? - Jacob
@ Jacob-你确定它不是没有背景的吗? - templatetypedef
很确定,是啊..抽水引理应该排除它,我也找不到可行的语法。 - Jacob
@雅各布 - 好的,很酷。关于如何检查R或RE-R中的某些内容,并没有严格的规则,但请记住R是一种非常强大的语言类。大多数涉及计数的事情都在R中,一个好的经验法则是,如果你能想到一个简单的计算机程序来解决它,那么它就在R中。在这种情况下,你能编写一个程序来检查是否有正确的字符串条件坚持? - templatetypedef
是的,我想这会相当容易..所以你认为说它在R中是一个很好的猜测,对吗? - Jacob


对于无上下文的语言 一个快速的方法就是看比较的数量。
在示例中看到 n<=m 和 m<=s。所以涉及两个比较。所以你可以把它简单地告诉它不是没有上下文的。如果涉及单个比较,则将其称为无上下文语言。

常规语言也是如此。两个变量之间应该没有关系,我的意思是说不能有任何比较。例如考虑语言 - 0^m+n 1^n 0^m。仔细看,只做了一个比较 m+n = n+m(推动和弹出符号)所以它是无上下文的。
现在看 0^n+m 1^n+m 0^m 清楚地看到前两个和下两个之间的比较。

我花了一些时间来搞清楚。但是需要一些人做出决定。相信我它确实有效。这是常规语言的最后一个例子。 a^n b^2m 是常规的(参见n和m之间没有比较)和 {a^n b^m |n=2m} 没有上下文,因为它只有一个比较(不常规)

希望这可以帮助


5
2018-01-30 06:52



@ saurabh srivastav你会怎么说L = {a ^ n b ^ m | n,m> = 1},这是CFL吗? - aparajita rai
@aparajitarai我会说,L是一种常规语言,因为你并不真正关心a的数量和b的数量之间的关系,你只是说语言中的每个字符串都必须从一些非大小为n的空前缀(它没有被定义,n应该是什么)后面跟着一个非空的b序列(其中m的长度上边界再次不受约束),所以你实际上可以构造一个正则表达式对于这种语言。如果我弄错了,请纠正我。我刚刚在我的大学学习理论计算机科学课程。 - jcxz