热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

形式语言与自动机---上下文无关语言&下推自动机

一、下推自动机(pushdownautomata)下推自动机是一个带栈的自动机,用于信息暂存和比对。非确定型下推自动机由一个七元组定义:[例]针对语言L{w∈{a,b}*:na(

一、下推自动机(pushdown automata)

下推自动机是一个带栈的自动机,用于信息暂存和比对。非确定型下推自动机由一个七元组定义:

image

imageimage

[例]针对语言 L={w∈{a,b}*:na(w)=nb(w)}构造一个npda。

image

      image

在处理baab过程中,该npda执行的迁移如下:

image

 

二、下推自动机与上下文无关语言

(a)证明:对于任何的上下文无关语言L,存在一个npda M使得L=L(M)。

npda可表示为:

image

其转移函数包括:

imageimage

目标是证明:若image,则:

image

假设文法化为格里巴范式,根据定义和上式得:

image

设w=a1a2…an,则:

image,根据规则得:

image

则存在image使得:image

如此重复,设image得到:

image

这使得任一时刻栈的内容(z除外)与句型中没有匹配的部分是一致的,因此:

image

若语言不包含空,则image;若包含空,则加入image,证毕。

 

(b)证明对于任何的npda,存在一个上下文无关文法与之对应。

简化问题,假定npda满足:

1.只有一个终态qf,且栈为空时进入终态。

2.所有转移函数形如:image,其中imageimage,也就是说每次迁移对栈进行的修改要么增加一个符号,要么减少一个符号。

为构造一个文法满足上述条件,则存在产生式imageimage为了擦除A,当读到a并且从qi到qj转换时,首先用BC替换A,接下来状态从qj转换到ql并擦除B,然后从ql转换到qk并擦除C)。

image作为开始符,则image,当读入w从q0转换到qf时,npda删除z(创建空栈),这就是npda接受w的过程。因此由文法生成的语言与npda接受的语言相同。证毕

[例]考虑npda,转移函数如下:

    image

q0为初态,q2为终态,该npda满足1但不满足2,为满足2引入新状态q3和中间步骤,在该步骤中线从栈中删除A,然后在下一次迁移中替换它。新规则集合为:

   image

后三个转移函数得到相应产生式:image

根据前两个转移函数得到产生式集合,其中开始变量为:image

image

image

image

符号串aab通过如下连续迁移能被pda接受:

image

 

三、确定型下推自动机和确定型上下文无关语言(每一步迁移都是唯一的)

若下推自动机image是确定型的,则还满足限制条件:

1.对任意给定的输入符号与栈顶符号,最多只能进行一种迁移;

2.若一格局存在空迁移,则不能有读入输入符号的迁移。如:imageimage

 

四、两个泵引理

1.上下文无关语言的泵引理

设L是一个无穷上下文无关语言,则存在一个|w|≥m的w(w∈L)能分解为:w=uvxyz。

其中|vxy|≤m 且 |vy|≥1,对所有的i=0,1,2…满足:uvixyiz∈L。

如下图的推导树为:

image

对应的推导为:

image

其中u,v,x,y,z都是终结符号,从上可知image,因而所有的符号串image,i=0,1,2…都能够根据文法声称,因此它们也属于L。

 

2.线性语言的泵引理(线性语言:满足线性上下文无关文法的语言)

设L是一个无穷线性语言,存在某个正整数m,使得任意w∈L(|w|≥m)都能够分解为w=uvxyz。

其中|uvyz|≤m 且 |xy|≥1,对所有的i=0,1,2…满足:uvixyiz∈L。

上述泵引理与1存在区别,由于2中|uvyz|≤m替换了1中的|vxy|≤m,表明可以抽取的符号串v与y必须分别位于w距左右两端长度为m的符号串中,而中间符号串x可以为任意长度。


推荐阅读
  • 近期,谷歌公司的一名安全工程师Eduardo Vela在jQuery Mobile框架中发现了一项可能引发跨站脚本攻击(XSS)的安全漏洞。此漏洞使得使用jQuery Mobile的所有网站面临潜在的安全威胁。 ... [详细]
  • 题目描述了一个病毒检测问题,要求使用AC自动机算法统计目标文本中多个模式串的出现次数。 ... [详细]
  • 本文详细介绍了如何使用递归方法对栈中的所有元素进行排序,确保从栈顶到底部的元素按升序排列。通过具体的代码示例,帮助读者理解栈排序的核心思想及实现步骤。 ... [详细]
  • 本文概述了算法的基础概念,包括时间复杂度的计算规则,以及常见的递归算法的时间复杂度分析。同时,详细介绍了数组和链表的基本特性及其操作的时间复杂度,并提供了几个关于链表操作的具体示例。最后,探讨了栈和队列的概念及其应用,包括如何利用这些数据结构解决实际问题。 ... [详细]
  • Vue项目中应用骨架屏实践
    在当前开发的项目中,由于登录过程涉及多次重定向,导致用户体验不佳。为了改善这一状况,本文介绍了如何使用vue-skeleton-webpack-plugin插件在Vue项目中实现骨架屏,以减少用户感受到的白屏时间。 ... [详细]
  • 原文:HowtoSpeedUpLo-Dash×100?IntroducingLazyEvaluation.作者:FilipZawada译文:怎样百倍加快Lo-Dash?引入惰性盘算 ... [详细]
  • JS的类型和值
    1.类型ECMAScript语言中所有的值都有一个对应的语言类型。ECMAScript语言类型包括Undefined、Null、Boolean、String、Number和Obje ... [详细]
  • 头文件duye_epoll.h************************************************************************** ... [详细]
  • 本文档介绍了在使用GitLab进行数据仓库项目开发时,如何管理和维护代码版本,包括非标准gitflow工作流下的分支结构及其权限设置,以及git commit message的规范。 ... [详细]
  • 本文介绍了ADB(Android Debug Bridge)的基本概念、安装方法、环境配置、连接真机步骤以及常用命令和高级技巧。ADB是一个强大的工具,适用于Android设备的开发和调试。 ... [详细]
  • 本文详细解析了muduo库中的Socket封装及字节序转换功能。主要涉及`Endian.h`和`SocketsOps.h`两个头文件,以及`Socket.h`和`InetAddress.h`类的实现。 ... [详细]
  • 本文详细介绍了 Vue 路由中的跳转方法、参数传递(包括 query 和 params)以及如何在目标组件中接收这些参数。 ... [详细]
  • 本题要求设计一个特殊的栈数据结构,该结构支持常规的栈操作,并额外提供一个min函数,用于返回栈中的最小值,且所有操作的时间复杂度均为O(1)。 ... [详细]
  • 本文详细介绍了如何通过修改Lua源码或使用动态链接库(DLL)的方式实现Lua与C++之间的高级交互,包括如何编译Lua源码、添加自定义API以及在C++中加载和调用Lua脚本。 ... [详细]
  • 深入理解Kafka架构
    本文将详细介绍Kafka的内部工作机制,包括其工作流程、文件存储机制、生产者与消费者的具体实现,以及如何通过高效读写技术和Zookeeper支持来确保系统的高性能和稳定性。 ... [详细]
author-avatar
给糖就不骗你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有