pumping lemma是regular languages和context-free languages的属性。但我见过的所有例子都是这样的:
L = {0 n 1 n 2 n :n≥0}
(顺便说一下,不是一种无上下文的语言)。
但我感兴趣的是:它是否有任何与远程实用或有用语言一起使用的例子?我找不到任何东西。这是绝对没有实际应用的那些事情还是纯粹的理论价值?
答案 0 :(得分:7)
L = {0 n 1 n :n≥0}是无上下文的语言。
表达式中的括号匹配可以被认为是类似的形式,即
L = {( n ) n :n≥0}
答案 1 :(得分:4)
这个python程序有效:
print ((((((((((((((((((((((((1))))))))))))))))))))))))
以及所有其他等效语句,左侧为(
,右侧为)
。
您无法构建正则表达式来验证,因此您必须使用解析器。
根本不是理论上的。这就是为什么你不能使用正则表达式解析HTML的原因。
答案 2 :(得分:2)
一个实际用途是每个人都可以停止尝试构建有限自动机来识别C#或Fortran的语法。
另一个实际用途是每个人都可以停止尝试构建一个下推自动机来识别C#或Fortran的语义。 (即使在Fortran中,如果拼错变量名称,您可以免费获得一个新变量,新变量可能不适用于您在命名其中一个声明变量时编码的运算符。)
答案 3 :(得分:1)
“这是绝对没有实际应用的那些事情还是纯粹的理论价值?”
槽糕。什么是实际应用?你明智地标记了你的问题“计算机科学”。所以我想你的问题是要问:“计算机科学是否实用?
在这种情况下,答案是......
当然是!它被教导为对不同语言复杂性类别进行分类的第一种方法之一,而不仅仅是“大O(whateverthehehell)”。 它表明存在超出运行时间的计算问题,在这种情况下,某些模型根本无法计算某些函数。* 这是关于自动机理论的形式证明的一个非常低级的介绍。
大多数计算机科学专业学生(我的同学)似乎都希望避免计算机科学的一大部分是计算理论,这种分类吸引了外表明显不足。
有希望的显而易见的事实是,无论喜欢与否,计算理论都是计算机科学的基础。不了解不同复杂性类别的想法(大O本身并没有削减它)不会拼写计算机科学家的死亡,但它会隐藏相当一部分的领域,从他或她的角度来看。
*是的,通常停止问题显示为第一次,但他们从未第一次得到它。
对于你的问题可能更愤世嫉俗的解释,你的意思是“任何软件真的使用它吗?”,我的回答当然不是。它是计算基础的一部分,而不是其应用。这并不是对它的应用听起来不屑一顾,根本不是。两者都是平等,高尚的价值。