L = {a ^ i b ^ j c ^ k d ^ l | i = k和j = l}我找不到给定语言的语法

问题描述 投票:-1回答:1

我尝试过

S-A|B
A-aCcD|aAc|ac
B-bBd|bd
C-b
D-d

此仅输出ac和bd,但我不能将b放在a和c之间。

regular-language automata automata-theory
1个回答
0
投票

考虑字符串a ^ p b ^ p c ^ p d ^ p。该字符串肯定是该语言的。如果语言是常规语言,并且存在常规语法,那么它将满足常规语言泵激引理的要求:即,上面给出的字符串可以写为uvx,其中| uv | <= p,| v | > 0,并且对于所有自然数n,u(v ^ n)x也是该语言。 v包含七种情况: a和b;只是b; b和c;只是c; c和d;或只是d。在任何情况下,泵浦v都会更改一种符号的实例数,但不会更改相应符号的实例数(语言需要的频率恰好相同)。因此,语言不能是常规的。

类似地,无上下文语言的泵送引理要求将上面给出的字符串写为uvxyz,其中| vxy | <= p,| vy | > 0,并且对于所有自然数n,u(v ^ n)x(y ^ n)z也是该语言的字符串。我们在这里得到与上面完全相同的情况,并得出完全相同的结论:该语言不能无上下文限制。

鉴于所有这些,我们也可能只针对一个不受限制的语法(可能有可能获得该语言的上下文相关语法,但这不是必需的)。我们想要相同数量的a和c,以及相同数量的b和d,并且希望它们按字母顺序排列。我们可以这样开始:

S -> ACS | BDS | T

这使我们得到的字符串中,A与C的数目相同,B与D的数目相同,以T结尾。接下来,我们需要一些规则以允许将符号A,B,C和D放在右边顺序:

BA -> AB
CA -> AC
DA -> AD
CB -> BC
DB -> BD
DC -> CD

最后,我们需要一种将非终端A,B,C和D转换为终端a,b,c和d的方式,除非它们全部正常,否则它将无法工作。我们可以使用T(以及即将引入的其他一些符号)从右向左扫动,进行转换:

DT -> Td
CT -> Uc
BT -> Vb
AT -> Wa
T -> e

CU -> Uc
BU -> Vb
AU -> Wa
U -> e

BV -> Vb
AV -> Wa
V -> e

AW -> Wa
W -> e

非端子T,U,V和W允许将A-D,A-C,A-B和A分别转换为a-d,a-c,a-b和a。我们也可以随时删除该标记符号。消除所有非终结符并获得终结符字符串的唯一方法(即根据此语法生成字符串)是从右向左扫掠,转换所有遇到的符号,并最终使用X-> e规则中的任何一个需要消除标记。仅当符号按从右到左的降序转换时,这才起作用,因此,根据需要,它们必须按从左到右的升序排列。由于S的生产将成对的A,C和B,D引入,因此也满足了这一要求。

© www.soinside.com 2019 - 2024. All rights reserved.