下推自动机
下推自动机是不确定的有限状态机以a的形式增加了额外的内存堆栈,这就是为什么使用术语“下推”,因为元素被下推到堆栈上。下推自动机是一种计算模型——理论上类似计算机的机器——它能做的比有限状态机多,但比有限状态机少图灵机.
下推自动机接受上下文无关语言,其中包括常规的语言.描述具有的字符串的语言匹配的括号是一种上下文无关的语言。假设程序员编写了一些代码,为了使代码有效,必须匹配任何括号。做到这一点的一种方法是将代码(作为字符串)输入一个下推自动机,该自动机用转换函数编程,实现平衡括号语言的上下文无关语法。如果代码有效且所有括号都匹配,则下推自动机将“接受”代码。如果有不平衡的圆括号,下推自动机将能够返回给程序员代码无效。这是计算机背后的一个比较理论化的概念解析器而且编译器.
下推自动机在考虑解析器设计和任何领域时都是有用的上下文无关文法都被使用,如in计算机语言设计。由于下推自动机在能力上与上下文无关的语言相同,有两种方法来证明一门语言是上下文无关的:提供上下文无关的语法或为该语言提供一个下推自动机。
下推自动机
一个堆栈可以想象成一堆盘子,一个叠在另一个上面,盘子可以从盘子上面取下来。为了找到盘子的底部,所有其他的盘子必须先被拿走。栈是后进先出的,或者后进先出、数据结构。在下推自动机中,状态转换包括向生成的字符串中添加一个符号,就像在FSMs中一样,但状态转换也可以包括关于的指令推而且出现元素之间的相互作用。
你可以浏览下推自动机图,看看是什么类型字符串可以由描述下推自动机生成的语言的转换函数生成,或者您可以为它提供一个输入字符串,并验证是否存在一组以创建输入字符串的接受状态结束的转换。
在每次转换时,一个下推自动机可以将一个符号推入堆栈,从堆栈中弹出一个符号,两者都做,或者不对堆栈进行操作。这个过渡符号是 . 也表示空字符串,可以用作符号。如果说明书上这么说的话 是否读取该符号,这意味着堆栈/输入为空。如果指令说将堆栈顶部的符号替换为 这意味着删除堆栈顶部的符号(这是弹出式的)。
下推自动机从一个空堆栈开始,如果堆栈结束时处于接受状态则接受。堆栈末尾的内容无关紧要,除非问题指定堆栈末尾必须为空。如果无法从当前状态进行转换,则拒绝。例如,如果从状态A到状态B的转换需要抛出an 从堆栈中,如果没有 栈顶要弹出,拒绝。
下推自动机可以建模为状态机图添加了关于堆栈的说明。在有限状态机中,状态之间的箭头用代表字符串输入符号的符号标记,而下推自动机则包含以下形式的信息:输入符号后面是当前堆栈顶部的符号,后面是要替换堆栈顶部的符号。这些指令有时用逗号、斜线或箭头分隔:
"replace with this symbol"命令的例外是在我们写入$符号之后的第一步:我们不覆盖(即弹出/删除)$符号。我们需要保持这个,这样当我们到达字符串的末尾时,我们就知道我们什么时候到达了堆栈的底部。而不是覆盖这个符号,只需将下一个堆栈符号放在$的顶部。
对于本例,假设 而且 是接受状态。这个下推自动程序只显示堆栈的指令;通常,下推自动机图还将包含从一种状态移动到另一种状态所需的符号的信息,但让我们使用这个例子来感受堆栈是如何工作的。假设堆栈一开始是空的,带有符号 ,表示堆栈的底部:因此堆栈初始设置为 .
下面这些转换之后的堆栈是什么样子的: 来 来 ?
下推自动推 然后推 所以这一点的堆栈是 .从空堆栈开始,转换后的堆栈是什么样子的 来 来 来 来 来 ?
下推自动推 推 推 持久性有机污染物 和持久性有机污染物 堆栈看起来像 .
栈的意义是什么?
栈允许下推自动使用有限的内存。下推自动机可以从堆栈中读取、推入(添加)或弹出(移除)堆栈。描述下推自动机的转换函数(通常用状态圆之间箭头上的标签表示)告诉自动机该做什么。
下推自动机接受上下文无关的语言。这意味着上下文无关的语言可以用一个下推自动机或一个上下文无关文法.
例如,包含所有0后面跟着相等数量的1的字符串的语言是上下文无关的语言,它的确是证明了在常规语言页面中,该语言不是常规语言,因此可以使用下推自动机表示该语言。
这是一个接受该语言中的字符串的下推自动机 .
注意:在从A到B的转换中,不要用空字符串覆盖$符号(即不要删除$),只在上面写新的符号。
正式的定义
上下文无关语法和下推自动机之间的翻译
你能给出一个推下自动机的图解和正式描述吗?它能识别只包含圆括号的字符串,并接受与圆括号匹配的字符串。这种语言的上下文无关语法是在这里.
注意: 可以是任何你想要的符号
我们刚刚表明,上面的问题可以用上下文无关的语法或下推自动机来表示。下面是如何在两者之间转换:
上下文无关的语法下推自动机:[3]
每一个推导或者产生给定字符串的生成规则序列由中间字符串(在派生的每个步骤中生成)组成。
下推自动机的非确定性帮助它猜测推导过程中产生所需字符串的步骤序列。因此,在推导的每一步中,都是非确定性地选择一个给定变量的生成规则,并将其替换为该变量。
下推自动机首先将一个符号压入堆栈,然后通过一系列中间字符串,直到到达一个只包含终端符号的字符串(如果该字符串确实在语法中,则会发生这种情况,否则将拒绝)。
下面是该怎么做:
- 将开始符号$推入堆栈。
然后重复以下步骤,直到自动机完成:
如果有一个变量 在堆栈的顶部,不确定地选择一个生成规则 和替代 使用位于生成规则右侧的字符串。
如果有一个终端变量 在输入中,从输入中读取下一个符号并将其与之进行比较 .如果它们相同,就重复;如果它们不相同,就在非决定论的这一分支上予以拒绝。
如果它是输入的结束栈的顶部有开始符号$,然后接受。
下推自动到上下文无关的语法:[3]
目标是制作一个下推自动机,它将接受上下文无关语法所接受的所有输入字符串。
对于每一对状态, 而且 ,就会有一个变量 从语法。这个变量将生成所有可以从状态获取下推自动机的字符串 州 .
下推自动机需要具备以下三个特性:
单一接受状态
栈在接受之前需要为空。
每个转换必须只进行推送或弹出—不能两者都做,也不能两者都做。要做到这一点,要模仿一个两者都不做的转换,我们需要一个推的转换,然后另一个弹出的转换,导致什么都不做的净动作。这些转换中的每一个都必须转到一个新的状态,所以如果我们要从上下文无关的语法转换到一个下推自动机,那么这个下推自动机可能拥有比它可能需要的更多的状态。
弦上的第一步 必须是push,因为堆栈开始时为空,最后的移动必须是pop,因为堆栈结束时必须为空。
有两种情况
在最后弹出的符号就是在开始时推入的符号。如果是这种情况,那么我们知道堆栈只在开始和结束时是空的。我们制定了生产法则 在哪里 是一个输入符号, 是在最后一步读取符号, 是之后的状态 , 是前面的状态吗 .
最后弹出的符号是不一开始就推出的标志。如果是这种情况,那么我们知道堆栈在开始和结束之间的某个时间一定是空的。我们制定了生产法则 在哪里 是一个输入符号, 堆栈变为空的状态,和 是前面的状态吗 .
与其他计算模型的关系
另请参阅
参考文献
- , J。Pushdown-overview.检索于2016年6月18日https://en.wikipedia.org/wiki/File:Pushdown-overview.svg
- 阿布杜拉,阿提格,M,斯坦曼,J。PDA的例子.检索于2016年6月18日https://www.semanticscholar.org/paper/Adding-Time-to-Pushdown-Automata-Abdulla-Atig/1c95cfb83c281a5d443e23fc38e378aed053efba
- 口,m(1997)。计算理论导论“,(页107)。PWS出版公司。
- 费奇,W. &弗里德里奇,A。人工语法学习遇到形式语言理论:综述.检索于2016年6月19日http://rstb.royalsocietypublishing.org/content/367/1598/1933