如何确定一种语言是递归的还是递归可枚举的?
Posted
技术标签:
【中文标题】如何确定一种语言是递归的还是递归可枚举的?【英文标题】:How to determine if a language is recursive or recursively enumerable? 【发布时间】:2011-06-28 13:26:11 【问题描述】:我必须确定一种语言(例如 L=a^nb^mc^s | 0
我知道如何确定一种语言是正则语言(查找有效的 DFA 或正则表达式)还是上下文无关(查找有效的 PDA 或上下文无关语法);我知道递归语言有一个总是停止的图灵机,而递归可枚举语言有一个可能不会停止的图灵机。
所以问题是:是否有一个快速标准来确定语言是递归的还是递归可枚举的,或者两者都不是?例如,我不必构建一个 PDA 来理解一种语言是上下文无关的,我看不到它需要一个堆栈的事实;有没有类似的快速方法来解决这个问题(希望可以省去构建图灵机的麻烦)?
【问题讨论】:
【参考方案1】:没有结构化的方法来检查一种语言是递归的还是递归可枚举的。实际上有一个非常酷的证据表明,对于任何能够识别递归语言的自动机,至少有一种 R 语言之外的自动机也接受的 RE 语言;它是对角化参数的一种变体,用于显示不可判定问题的存在。
证明一种语言在 RE 而不是 R 中的主要方法是证明该语言在 RE 中(也许通过为其定义一个 TM),然后将 RE 中的已知问题而不是 R 简化为该问题.例如,如果您可以证明任何停止问题的实例都可以通过将其转换为您的问题的实例来解决,那么您就知道它不能有递归解决方案,并且如果您跟进这个问题的 TM语言你知道该语言是RE。一起,您在 RE 中拥有一门语言,但在 R 中没有。
【讨论】:
这肯定不是我希望的答案:(虽然它澄清了我的一些疑问,所以谢谢!所以,如果你必须解决我一开始写的例子,怎么会你继续(知道它不是上下文无关的)? @Jacob- 你确定它不是上下文无关的吗? 相当肯定,是的。。抽引理应该排除它,我也找不到可行的语法。 @Jacob- 好的,很酷。关于如何检查 R 或 RE - R 中的内容并没有硬性规定,但请记住,R 是一类非常强大的语言。大多数涉及计数的事情都在 R 中,一个好的经验法则是,如果你能想到一个简单的计算机程序来解决它,那么它就在 R 中。在这种情况下,你能否编写一个程序来检查字符串条件是否正确是真的吗? 是的,我想这很容易......所以你认为说它在 R 中是一个很好的猜测,对吧?【参考方案2】:对于上下文无关语言,一种快速的方法是查看比较次数。
在示例中,请参见 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
是上下文无关的,因为它只有一个比较(不是常规的)
希望对你有帮助
【讨论】:
@saurabh srivastav 你对 L=a^n b^m| 有什么看法? n,m>=1,这是节能灯吗? @aparajitarai 我会说,L 是一种常规语言,因为你并不真正关心 a 的数量和 b 的数量之间的关系,你只是说语言必须以大小为 n 的 a 的一些非空前缀开头(但未定义,n 应该是什么),然后是 b 的非空序列(其中 m 的长度上边界再次不受限制),所以你实际上可以为这种语言构造一个正则表达式。如果我错了,请纠正我。我刚刚在我的大学学习理论计算机科学课程。以上是关于如何确定一种语言是递归的还是递归可枚举的?的主要内容,如果未能解决你的问题,请参考以下文章