Regex 常规语言与非常规语言

Regex 常规语言与非常规语言,regex,regular-language,Regex,Regular Language,有谁能帮我区分正则语言(即那些可以用正则表达式描述的语言)和其他在正则语言的形式定义方面不是正则的语言?此外,您能提供一些两侧的示例吗?如果可以将表达式分解为四个基本语言概念,则表达式是正则表达式: 单个字符。例如a,b,c 两个正则表达式之间的连接。例如ab,abc 两个正则表达式之间的析取。例如a|b 克莱恩星:例如(ab)* 正则表达式中的其他方面只是语法上的糖。例如,(ab)+是(ab)(ab)*的缩写,[A-F]是A | B | C | D | E | F的缩写 可以证明某些语言(

有谁能帮我区分正则语言(即那些可以用正则表达式描述的语言)和其他在正则语言的形式定义方面不是正则的语言?此外,您能提供一些两侧的示例吗?

如果可以将表达式分解为四个基本语言概念,则表达式是正则表达式:

  • 单个字符。例如
    a
    b
    c
  • 两个正则表达式之间的连接。例如
    ab
    abc
  • 两个正则表达式之间的析取。例如
    a|b
  • 克莱恩星:例如
    (ab)*
正则表达式中的其他方面只是语法上的糖。例如,
(ab)+
(ab)(ab)*
的缩写,
[A-F]
A | B | C | D | E | F
的缩写

可以证明某些语言(字符串集)不能使用正则表达式表示。例如,一种语言
{ab,aabb,aaabbb,…}
,其中剩下的
a
b
一样多,不能使用正则表达式来表示


乔姆斯基对如何识别这些语言有一个定义(例如使用上下文无关语法(CFG)、上下文敏感语法(CSG)、图灵机器和Oracle机器)。正则语言在字母表a上递归定义如下:

  • 空集合\null是常规集合
  • 集合{\eps}是正则的,其中\eps是空字符串
  • 集合{a}对于a中的所有a\都是正则的
  • 如果X和Y是正则的,那么集合{xy | X\inx,Y\iny}也是正则的
  • 如果X和Y是正则的,那么X\Y也是正则的
  • 如果X是正则的,那么{X^n | X\in X和n>=0}也是正则的
  • 在6中,x^n的定义是x与其自身连接n次,x^0=\eps

    除6外,所有这些步骤都是正则的。当我们考虑无穷集时,所有有趣的事情都发生了。

    正则表达式只是一种表示正则语言的“编程语言”。它们是这样工作的。我将使用“regex”作为正则表达式的缩写

  • regex\NULL代表空集合
  • regex\EPS代表{\EPS}
  • regexa代表集合{a}。请注意,粗体a表示regex,而不是它所代表的字符a
  • 如果正则表达式x代表语言x,而y代表y,那么正则表达式xy代表语言{xy | x\in x,y\in y}
  • 如果正则表达式x代表语言x,而y代表y,则正则表达式x | y代表语言x\y
  • 如果regexx代表语言x,那么regexx*代表语言{x^n | x\in x,n>=0}
  • 定义直接暗示了每个正则表达式都描述了一种正则语言。不难反其道而行之,证明每个正则语言都必须有一个对应的正则表达式

    因此,您所要求的正则语言示例都是一些正则表达式所代表的语言。例如:ab*是所有字符串的语言,以a开头,后跟任意数量的b,依此类推

    有一些非常酷的语言看起来太复杂而不是规则的,但实际上是。我最喜欢的是所有数字N的二进制表示集S_k(字母表{0,1}),比如N==0 mod k。你可以选择任何你喜欢的正整数k

    Kleene提出了一个更进一步的奇妙定理。它表明,可识别的语言——简单状态机——和不确定有限自动机——状态机在空字符串上有转换,并且允许每个字符上有多个转换——正是正则语言。它们都有相同的表达式就是说,如果你给我{regex,DFA,NFA}中的任何一个,我每次都能转换成另外两个

    上面描述的任意集合S_k的正则表达式,如你所愿选择k,是极其复杂的,但是识别它的DFA非常简单。克莱恩定理让你使用最好的工具

    有限自动机实际上有有限的内存,所以你会期望——你是对的——具有某种无限结构的语言不会是规则的。最简单的这种语言可能是{a^n b^n | n>=0}。这是a的所有字符串后跟相等数量的b的集合。任何有限自动机(因此是regex或NFA)如果n足够大,则必须无法“存储”在查看a时记录的n值。因此,必须无法查找稍后在输入中出现的相同数量的b

    同样观点的另一种说法是:如果你声称你有一个由N个状态组成的DFA,它将识别{a^NB^N | N>=0},我将给你字符串{a^k b^k | k>N},它将在那里失败,因为它必须“循环”,即重复至少一个状态。此时,is已不知道到目前为止已读取了多少。对于其中一些长字符串,它注定会得到错误的答案

    泵送引理利用了这一事实。它提供了一种数学上严格的方法(通过引理的矛盾)证明语言是不规则的。每一个优秀的计算机科学学生都学会了按照PL所要求的方式“向上(或向下)泵送”,以证明集合是不规则的

    非正则语言的例子包括前面提到的{a^nb^n | n>=0}以及需要各种“平衡”的类似语言:{a^nb^m | n>m}、{a^nba^n},以及无数类似语言

    非正规语言可以进一步细分