【问题标题】:Expression for this language这种语言的表达
【发布时间】:2021-01-31 15:50:49
【问题描述】:

一种语言,用于生成所有 a 多于 b 的字符串(不一定只多一个,如语言 EQUAL 的非终结符 A,但 a 多于 b 的任何数量)。

【问题讨论】:

  • 到目前为止您尝试了哪些方法,您遇到了哪些问题?你追求什么样的机器人?掌上电脑? TM值?还有什么?

标签: expression automata


【解决方案1】:

首先,让我们通过使用正则语言的泵引理来证明该语言不是正则的。假设这种语言是常规的。然后,通过抽引引理,我们知道长度至少为 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

我们可以修改这个语法如下:

  1. 只要我们允许一个 a,就允许任意数量的 a
  2. 而不是允许空字符串,要求字符串中至少有一个a

这暗示了语法

S -> ST | TS | ASb | bSA | A
T -> TT | ATb | bTA | e
A -> aA | a

注意:我们引入了非终结符 A 来捕捉允许任意数量的 a 代替一个的想法,并且我们添加了非终结符 T 来辅助“至少一个”a 的概念。我们在这里需要一个新的非终结符,因为否则每次我们使用产生式 S -> SS 时,我们都需要语法中的额外 a,而语言中的字符串可能没有。

为了证明这个语法是正确的,我们可以证明:

  1. 它只生成该语言的字符串,即它生成的所有字符串a多于b
  2. 它生成该语言中的所有字符串,也就是说,对于任何 a 多于 b 的字符串,此语法都会派生该字符串

为了显示第一部分,只需注意任何添加 b 的产生式也至少添加一个 a,并且要消除 S 的所有实例需要使用产生式 S -> a 恰好一次,这确保至少多了一个 a在最后的字符串中比有 b 的。

为了展示第二部分,考虑这个过程来生成任何字符串:

  1. 如果字符串的形式为 a*,则使用 S -> A -> a*。

  2. 如果字符串以a开头并以b结尾,则使用S -> ASb -> aSb 将最外面的a和b剥离。然后,使用相同的过程解决大小 (N - 2) 的子问题。请注意,我们删除了相同数量的 a 和 b,因此如果原始字符串的 a 多于 b,那么子问题中的字符串也是如此。

  3. 如果字符串以b开头并以a结尾,则使用S -> bSA -> bSa将最外面的a和b剥离。然后,使用相同的过程解决大小 (N - 2) 的子问题。请注意,我们删除了相同数量的 a 和 b,因此如果原始字符串的 a 多于 b,那么子问题中的字符串也是如此。

  4. 如果字符串以相同的符号开头和结尾,则找到字符串的任何前缀,使其和互补后缀的 a 至少与 b 一样多。这必须是可能的,因为字符串的 a 比 b 多,并且由于单词以相同的符号开头和结尾,因此前缀和后缀都不需要为空。然后,使用 S -> TS 或 S -> ST,取决于前缀或后缀是否可能包含相同数量的 a 和 b,并解决子问题。

在此过程的步骤 3 中严格证明声明作为练习:

如果一个由 a 和 b 组成的字符串以相同的符号开始和结束,并且包含的​​ a 多于 b,则该字符串可以拆分为前缀和后缀,每个前缀和后缀中的 a 至少与 b 一样多。

【讨论】:

    猜你喜欢
    • 2011-08-16
    • 2014-02-25
    • 2015-01-10
    • 2014-09-21
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2013-11-07
    相关资源
    最近更新 更多