我正在愚蠢地试图为非上下文语言L = {a ^(n)b ^(n)c ^(n)| n> = 1}构建一个下推自动机,并考虑到两种方法。
第一种方法: -
我认为对于字符串中的每个'a',我会将3'a'推入堆栈,对于字符串中的每个'b',我现在将从堆栈中弹出2'a'用于每个'c'in字符串我仍然会在堆栈中有1个'a'。
第一种方法的问题: - 生成的语言变成这样的事情L = {a ^(p)b ^(m)c ^(n)| p> = 1且 无法确定如何定义m和n }
第二种方法: -
我们知道L = {a ^(n)b ^(m)c ^(m)d ^(n)| n> = 0}是无上下文的语言,L = {wxw | w∈(a,b)*}也是无上下文的语言。
所以,我认为L = {a ^(n)b ^(m)b ^(m)c ^(n)| n> = 1且m = floor((n + 1)/ 2)}
第二种方法的问题: - 不知道我们是否可以在不影响堆栈元素的情况下计算PDA中的楼层(n + 1/2)。
请帮助确定如何在第一种方法中定义m和n,以及如何在PDA中找到地板((n + 1)/ 2)。
如果需要,可以同时使用JFLAP文件。
答案 0 :(得分:1)
您没有设法为此语言构建下推自动机的一个原因是因为没有任何原因。 Bar Hillel pumping lemma显示了这一点。
概述证明,假设可以完成。然后,对于某些 p ,每个大于 p 的字符串都可以分区为 uvwxy ,s.t。,
| VWX | < P
| VX | > 1
uv n wx n y 也被自动机接受。
第一条规则暗示 vwx 不能跨越三个区域,最多只能跨越两个区域(对于足够大的字符串)。第二条和第三条规则现在意味着你可以抽水,使得无跨区域小于至少一个其他区域。
答案 1 :(得分:1)
正如Ami Tavory指出的那样,这种语言没有PDA,因为这种语言不具备上下文。如果您使用队列而不是堆栈,使用两个堆栈或使用图灵机(所有等价物),则很容易识别这种语言。
队列机器:
a
s,就会排队a
,直到看到b
。a
s,就会将b
队列为b
并将其排队,直至看到c
b
s。c
出列
双栈PDA:
a^n b^n
时,使用第一个堆栈确保a
a
,并在看到a
时弹出b
; b^n c^n
时,使用第二个堆栈确保b
b
,并在看到b
时弹出c
; 图灵机:
a^n ... c^n
替换每个a
并删除匹配的A
; c
A^n b^n
和A
对,确保b
; A
且不再有b
,即磁带已完全清除。