【发布时间】:2021-01-31 15:50:49
【问题描述】:
一种语言,用于生成所有 a 多于 b 的字符串(不一定只多一个,如语言 EQUAL 的非终结符 A,但 a 多于 b 的任何数量)。
【问题讨论】:
-
到目前为止您尝试了哪些方法,您遇到了哪些问题?你追求什么样的机器人?掌上电脑? TM值?还有什么?
标签: expression automata
一种语言,用于生成所有 a 多于 b 的字符串(不一定只多一个,如语言 EQUAL 的非终结符 A,但 a 多于 b 的任何数量)。
【问题讨论】:
标签: expression automata
首先,让我们通过使用正则语言的泵引理来证明该语言不是正则的。假设这种语言是常规的。然后,通过抽引引理,我们知道长度至少为 p 的语言中的任何字符串都可以写成 uxv 使得 |ux| 0 并且对于所有非负整数 n,u(x^n)v 也在语言中。选择作为我们的代表字符串 b^p a^(p+1)。这个字符串显然是我们的语言,因为它的 a 比 b 多。用 |ux| 将其重写为 uxv 0,选择 n > 1 会导致我们单独增加 b 的数量,这意味着在结果字符串中 a 的数量不超过 b 的数量。这是一个矛盾,所以我们唯一的假设 - 该语言是常规语言 - 一定是错误的。
接下来,让我们看看该语言是否是上下文无关的。请注意,a 多于 b 的语言与 a 和 b 数量相同的语言相似,我们认为这是一种规范的上下文无关语言:
S -> SS | aSb | bSa | e
我们可以修改这个语法如下:
这暗示了语法
S -> ST | TS | ASb | bSA | A
T -> TT | ATb | bTA | e
A -> aA | a
注意:我们引入了非终结符 A 来捕捉允许任意数量的 a 代替一个的想法,并且我们添加了非终结符 T 来辅助“至少一个”a 的概念。我们在这里需要一个新的非终结符,因为否则每次我们使用产生式 S -> SS 时,我们都需要语法中的额外 a,而语言中的字符串可能没有。
为了证明这个语法是正确的,我们可以证明:
为了显示第一部分,只需注意任何添加 b 的产生式也至少添加一个 a,并且要消除 S 的所有实例需要使用产生式 S -> a 恰好一次,这确保至少多了一个 a在最后的字符串中比有 b 的。
为了展示第二部分,考虑这个过程来生成任何字符串:
如果字符串的形式为 a*,则使用 S -> A -> a*。
如果字符串以a开头并以b结尾,则使用S -> ASb -> aSb 将最外面的a和b剥离。然后,使用相同的过程解决大小 (N - 2) 的子问题。请注意,我们删除了相同数量的 a 和 b,因此如果原始字符串的 a 多于 b,那么子问题中的字符串也是如此。
如果字符串以b开头并以a结尾,则使用S -> bSA -> bSa将最外面的a和b剥离。然后,使用相同的过程解决大小 (N - 2) 的子问题。请注意,我们删除了相同数量的 a 和 b,因此如果原始字符串的 a 多于 b,那么子问题中的字符串也是如此。
如果字符串以相同的符号开头和结尾,则找到字符串的任何前缀,使其和互补后缀的 a 至少与 b 一样多。这必须是可能的,因为字符串的 a 比 b 多,并且由于单词以相同的符号开头和结尾,因此前缀和后缀都不需要为空。然后,使用 S -> TS 或 S -> ST,取决于前缀或后缀是否可能包含相同数量的 a 和 b,并解决子问题。
在此过程的步骤 3 中严格证明声明作为练习:
如果一个由 a 和 b 组成的字符串以相同的符号开始和结束,并且包含的 a 多于 b,则该字符串可以拆分为前缀和后缀,每个前缀和后缀中的 a 至少与 b 一样多。
【讨论】: