automata - 以下 CFL 和非 CFL 的并集是 CFL 本身吗?

标签 automata

我是一名助教,一位学生向我提出了以下问题。尴尬的是,我无法想出答案,所以我向你们求助。

我们知道 L_1 = {a^n b^n c^n} 是非 CFL。 我们还知道 L_2 = {a^i b^k c^j : i != k } 上下文无关。

那些的联合怎么样? (这显然是不规则的) 它是上下文无关的吗?

最佳答案

我们选择语言 U = {a^i b^j c^k | N 中的 i、j、k}。

则 L_1^C = {a^i b^j c^k | i!=j 或 j!=k} = {a^i b^j c^k | i!=j} 并集 {a^i b^j c^k | j != k} = L_A 并集 L_B。请注意,L_A = L_2。

根据 DeMorgan,L_1 union L_2 = (L_1^C intersect L_2^C)^C = ((L_A union L_B) intersect L_2^C)^C,根据分配律是 ((L_A intersect L_2^C)并集(L_B 与 L_2^C))^C 相交。

回想一下,由于 L_A = L_2,我们得到 (L_B intersect L_2^C)^C。根据 DeMorgan,我们可以将其呈现为 L_B^C 并集 L_2。我们已经承认 L_2 是上下文无关的。我们宇宙中 L_B 的补集是 {a^i b^j c^k | j=k},这也是上下文无关的。两种上下文无关语言的并集也是上下文无关的,所以是的,L_1 并集 L_2 是上下文无关的。

完成手续后,直觉就很明显了:L_1 union L_2 相当于说要么 i != j(a 和 b 的数量不同),要么 b 和 c 的数量相同。如果你仔细想想,这完美地捕获了语言的要求:如果 i != j,我们就可以完成第二部分;我们无法进入 L_2 的唯一方法是,如果我们已经知道 i = j,并且我们只需担心保证 j = k。

在 bool 逻辑中:(a and b) or (not a) 等价于 (b or (not a))。

该语言的 CFG 如下:

S := A | C
A := aA | B
B := lambda | bBc
C := Cc | D | E
D := a | aD | aDb
E := b | Eb | aEb

您可以通过自上而下或自下而上的解析器构造来获取 PDA。

关于automata - 以下 CFL 和非 CFL 的并集是 CFL 本身吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9395964/

相关文章:

python - 元胞自动机算法似乎不起作用

fsm - 描述 DFA 或 NFA 的语法

state - 将 Epsilon-NFA 转换为 NFA

java - 循环程序在完成检查后再次启动

compiler-construction - 语言编译器是否使用复杂的 DFA 来接受程序?

automata - 为 L = {(na(w)-nb(w)) mod 3>0} 构造 DFA

prolog - 在没有算术的情况下识别 Prolog 中的 A^n B^n 语言

context-free-grammar - 来自上下文无关语言的正式上下文无关语法

javascript - 除了 ECMAScript 规范中提供的上下文无关语法之外,是否还有其他方法可以将 JavaScript 词法化为 token ?