微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这种语言的表达

如何解决这种语言的表达

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

解决方法

首先,让我们通过使用正则语言的抽水引理来证明该语言不是正则的。假设这种语言是规则的。然后,通过抽引引理,我们知道长度至少为 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 代替 1 的想法,并且我们添加了非终结符 T 来辅助“至少一个”概念。我们在这里需要一个新的非终结符,否则每次我们使用产生式 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. 如果字符串以相同的符号开始和结束,请找到字符串的任何前缀,使其和互补后缀都至少具有与 b 一样多的 a。这一定是可能的,因为字符串的 a 比 b 多,而且由于单词以相同的符号开始和结束,因此前缀和后缀都不需要为空。然后,根据前缀或后缀是否可能包含相同数量的 a 和 b,使用 S -> TS 或 S -> ST,并解决子问题。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。