查找以下语言的上下文无关语法

时间:2019-06-16 22:43:47

标签: context-free-grammar

查找以下语言(n≥0和m≥0)的上下文无关文法:L = {w∈{a,b} *:n_a≠n_b}

假设:n_a = n_b
S-> SS |抗体bSa | λ

添加a或添加b的 S-> SS |抗体bSa | aS | bS |一个| b

1 个答案:

答案 0 :(得分:1)

如果a的数量与b的数量不同,则存在更多a或更多b。我们可以分别处理这些情况。让我们先处理一下。为了确保a大于b,我们可以从相等的a和b开始并进行一些更改。

S -> e | Sab | Sba | aSb | bSa | abS | baS

应该是一种语法,该语法可以为我们提供完全相同的数字a和b。我为什么这么认为?它涵盖了一次添加一个a和一个b的所有安排,因此可能可行。练习:证明。

接下来,我们要允许添加更多a。我们对此可能会感到愚蠢,只需引入一个新符号即可给我们一个*,并将其散布在我们的所有作品中:

S -> A | ASAaAbA | ASAbAaA | AaASAbA | AbASAaA | AaAbASA | AbAaASA
A -> Aa | a

对于更多B,我们可以做同样的事情:

S -> B | BSBaBbB | BSBbBaB | BaBSBbB | BbBSBaB | BaBbBSB | BbBaBSB
B -> Bb | b

现在获得答案就像合并:

S -> A | ASAaAbA | ASAbAaA | AaASAbA | AbASAaA | AaAbASA | AbAaASA
S -> B | BSBaBbB | BSBbBaB | BaBSBbB | BbBSBaB | BaBbBSB | BbBaBSB
A -> a | Aa
B -> b | Bb

编辑-正如Welbog在评论中指出的那样,这遗漏了一些字符串,因为A和B不是派生a *和b *而是a +和b +,因此我们强迫添加比我们更多的a和b在某些情况下实际需要。解决此问题的一种也许不太可怕的方法是更改​​A和B来得出a *和b *,然后在每个产品中正好在A和B之一上简单地插入a和b以及A和B。就像上面的语法一样,这将强制至少再增加一个a / b并任意允许更多的a / b,而无需多个其他实例。所以:

S -> Aa | AaSAaAbA | AaSAbAaA | AaaASAbA | AabASAaA | AaaAbASA | AabAaASA
        | ASAaaAbA | ASAabAaA | AaAaSAbA | AbAaSAaA | AaAabASA | AbAaaASA
        | ASAaAabA | ASAbAaaA | AaASAabA | AbASAaaA | AaAbAaSA | AbAaAaSA
        | ASAaAbAa | ASAbAaAa | AaASAbAa | AbASAaAa | AaAbASAa | AbAaASAa
S -> Bb | BbSBaBbB | BbSBbBaB | BbaBSBbB | BbbBSBaB | BbaBbBSB | BbbBaBSB
        | BSBbaBbB | BSBbbBaB | BaBbSBbB | BbBbSBaB | BaBbbBSB | BbBbaBSB
        | BSBaBbbB | BSBbBbaB | BaBSBbbB | BbBSBbaB | BaBbBbSB | BbBaBbSB
        | BSBaBbBb | BSBbBaBb | BaBSBbBb | BbBSBaBb | BaBbBSBb | BbBaBSBb
A -> e | Aa
B -> e | Bb

其中一些产物可能是不必要的,但是语法应该起作用。