Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Context free grammar 查找以下语言的上下文无关语法_Context Free Grammar - Fatal编程技术网

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

Context free grammar 查找以下语言的上下文无关语法,context-free-grammar,Context Free Grammar,使用n查找以下语言的上下文无关语法≥0和m≥0:L={w∈{a,b}*:n_a≠n_b} 假设:n_a=n_b S->SS | aSb | bSa |λ 添加a或添加b S->SS | aSb | bSa | aS | bS | a | b如果a的数量与b的数量不同,那么要么有更多的a,要么有更多的b。我们可以分别处理这些案件。让我们先来处理更多的情况。为了确保a多于b,我们可以从a和b的相等数量开始,并进行一些更改 S -> e | Sab | Sba | aSb | bSa | abS

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

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

添加a或添加b
S->SS | aSb | bSa | aS | bS | a | b

如果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

其中一些产品可能是不必要的,但语法应该是有效的

欢迎来到StackOverflow!StackOverflow希望您这样做,尤其是在涉及到。请更新您的问题,以显示您已在某个应用程序中尝试过的内容。有关更多信息,请参见,并以。您将需要更多的组合,而不仅仅是a | asaaba | asaaaa | AaASAbA | AbASAaA | AaAbASA | abaaaa,例如,无法匹配语言中的aab。对于上面的每种模式,比如ASaAbA,你需要制作一个有a和没有a的变体,留下至少一个,比如ASaAbA | SAaAbA | ASaAbA | ASaAbA | ASAaAb | SaAbA |等@Welbog是的,我想我写的那些模式都假设了a*,然后意识到我需要强制至少一个a,但没有回去调整。我会考虑是否有办法节省一些额外的制作。