我看到了这个问题,并对什么是抽水引理感到好奇(维基百科没有太大帮助)。
我了解这基本上是理论上的证明,对于某种语言在某类课程中必须是正确的,但是除此之外,我并没有真正理解它。
任何人都想尝试以非数学家/比较科学博士可以理解的方式在相当细粒度的级别上解释它吗?
Answers:
抽水式引理是显示语言不规则的简单证明,这意味着无法为其构建有限状态机。典型的例子是语言(a^n)(b^n)
。这是简单的语言,它可以是任意数量的a
s,然后是相同数量的b
s。所以弦
ab
aabb
aaabbb
aaaabbbb
等以语言显示,但
aab
bab
aaabbbbbb
等不是。
为这些示例构建FSM非常简单:
这个将一直工作到n = 4。问题在于我们的语言没有对n施加任何约束,并且有限状态机必须是有限的。无论我在这台计算机上添加多少个状态,都可以给我输入n等于状态数加1的输入,我的计算机将发生故障。因此,如果有一台机器可以读取该语言,则必须在其中某处存在一个循环以保持有限的状态数。添加以下循环:
我们语言中的所有字符串都将被接受,但是存在问题。在前四个a
s之后,由于机器a
保持在相同状态,因此无法记录已输入多少s的计数。这意味着在四之后,我可以a
在字符串中添加任意数量的b
s,而无需添加任何s,并且仍然获得相同的返回值。这意味着字符串:
aaaa(a*)bbbb
与(a*)
代表任意数量的a
S,将全部由即使他们显然不是所有的语言机器被接受。在这种情况下,我们可以说字符串的一部分(a*)
可以被抽出。有限状态机是有限的且n是无界的,这保证了接受语言中所有字符串的任何机器都必须具有此属性。机器必须在某个点循环,并且在循环点可以泵送语言。因此,无法为该语言构建有限状态机,并且该语言不是常规语言。
请记住,正则表达式和有限状态机是等效的,然后替换a
并b
使用可相互嵌入的Html标签打开和关闭,您会看到为什么无法使用正则表达式解析Html的原因。
a^n b^n
是不规则的,也没有提出关于抽水引理的许多直觉。
这是一种旨在证明给定语言不能属于特定类别的设备。
让我们考虑平衡括号的语言(意思是符号'('和')',包括所有按通常意义平衡的字符串,没有不平衡的字符串)。我们可以使用抽水引理来证明这是不正常的。
(语言是一组可能的字符串。解析器是一种机制,我们可以用来查看字符串是否在该语言中,因此它必须能够分辨出该语言中的字符串与外部字符串之间的区别。如果有常规(或其他)解析器可以识别语言,则该语言为“常规”(或“无上下文”或“上下文敏感”等)语言,以区分该语言中的字符串和非该语言中的字符串语言。)
LFSR咨询提供了很好的描述。我们可以将常规语言的解析器绘制为框和箭头的有限集合,其中箭头代表字符,框将它们连接起来(充当“状态”)。(如果比这更复杂,则它不是常规语言。)如果我们得到的字符串长于框数,则意味着我们经历了一个框不止一次。这意味着我们有一个循环,我们可以根据需要多次循环。
因此,对于常规语言,如果我们可以创建任意长的字符串,则可以将其划分为xyz,其中x是循环开始时需要的字符,y是实际循环,而z是我们所需要的循环后需要使字符串有效。重要的是x和y的总长度是有限的。毕竟,如果长度大于盒子的数量,那么我们显然在进行此操作时就经过了另一个盒子,因此存在一个循环。
因此,在我们平衡的语言中,我们可以从编写任意数量的左括号开始。特别是,对于任何给定的解析器,我们可以写入的左解析器多于框,因此解析器无法分辨出有多少个左解析器。因此,x是左括号的一些量,这是固定的。y也是左括号的数量,并且可以无限期增加。可以说z是一些右括号。
这意味着我们的解析器可能识别出一个由43个左括号和43个右括号组成的字符串,但是解析器无法从一个由44个左括号和43个右括号组成的字符串中分辨出来,这不是我们的语言,因此解析器无法解析我们的语言。
由于任何可能的常规解析器都有固定数量的框,因此我们总是可以写出更多的左解析器,并且通过抽水引理,我们可以以解析器无法分辨的方式添加更多的左解析器。因此,平衡的括号语言不能由正则解析器解析,因此不是正则表达式。
用外行人的术语很难理解,但是基本上正则表达式中应该包含一个非空的子字符串,该子字符串可以重复多次,而整个新单词对该语言仍然有效。
在实践中,泵词引理不足以证明一种语言正确无误,而是作为一种通过矛盾进行证明的方式,并且通过显示泵词引理可以证明该语言不适合语言类别(常规或上下文无关)不适合它。
简单抽引引理是常规语言的引理,其中包括有限自动机描述的字符串集。有限自动化的主要特征在于,它仅具有有限数量的内存(由状态描述)。
现在假设您有一个字符串,该字符串可以通过有限的自动机识别,并且该字符串足够长,可以“超出”自动化的内存,即状态必须重复。然后有一个子字符串,其中子字符串开头的自动机的状态与子字符串末尾的状态相同。由于读取子字符串不会改变状态,因此可以将其删除或重复任意次,而无需使用自动机。因此,还必须接受这些修改后的字符串。
对于上下文无关的语言,还有一个更复杂的抽取引理,您可以在其中删除/插入在字符串中两个位置直观地视为匹配括号的内容。
根据定义,常规语言是指由有限状态自动机识别的语言。可以将其视为迷宫:状态是房间,过渡是房间之间的单向走廊,有初始房间和出口(最终)房间。就像“有限状态自动机”这个名字所说,房间数量有限。每次沿着走廊旅行时,都会记下写在墙上的信。如果您能以正确的顺序找到从最初的房间到最后一个房间的路径,该路径穿过标有字母的走廊,则可以识别一个单词。
抽水引理说,有一个最大长度(抽水长度),您可以在迷宫中漫步,而不必回到以前经过的房间。这样做的想法是,由于只有有限的房间可以进入,经过某个点,因此您必须退出迷宫或越过轨道。如果您设法走的路比迷宫中的这个抽水长度更长,那么您将绕道而行:您在路径中插入了(至少一个)可以删除的循环(如果您想让迷宫越过识别较小的单词)或无限期重复(抽取)(允许识别超长单词)。
上下文无关的语言也有类似的引理。这些语言可以表示为下推自动机接受的单词,下推自动机是有限状态自动机,可以利用堆栈来确定要执行的转换。尽管如此,由于存在状态stilla有限数量,直觉上面所解释的过载,甚至通过属性的正规表达式可能稍微更复杂。
用外行的话来说,我认为你几乎是对的。这是一种证明技术(实际上是两种),用于证明某种语言不在特定类别中。
例如,请考虑其中包含无限数量的字符串的常规语言(regexp,自动机等)。正如starblue所说,在某个时候,您用完了内存,因为字符串对于自动机来说太长了。这意味着必须有一部分字符串,自动机无法分辨出您拥有多少个副本(您处于循环中)。因此,该子字符串在字符串中间的任意数量的副本,您仍然可以使用该语言。
这意味着,如果您使用的语言不具有此属性,即,字符串足够长且没有子字符串,您可以重复任意次并且仍然使用该语言,则该语言不是常规语言。
例如,采用这种语言L = a n b n。
现在尝试将上述语言的有限自动机可视化一些n。
如果n = 1,则字符串w = ab。在这里,如果n = 2,则字符串w = a 2 b 2,我们可以制作一个没有循环的有限自动机。在这里,我们可以制作一个没有循环的有限自动机
如果n = p,则字符串w = a p b p。本质上可以假设一个有限的自动机分为三个阶段。第一阶段,需要一系列输入,然后进入第二阶段。同样,从阶段2到阶段3。我们将这些阶段称为x,y和z。
有一些观察
因此,阶段y的有限自动机状态应能够接受输入“ a”和“ b”,并且不应接受无法计数的更多a和b。
因此,阶段y的设计纯粹是无限的。我们只能通过放置一些循环来使其有限,如果我们放置循环,则有限自动机可以接受L = a n b n以外的语言。因此,对于这种语言,我们无法构造有限的自动机。因此,这是不规则的。