我似乎找不到相同的LR语法:
S→aSbS | bSaS | ε
我认为识别字符串的数字'a'与'b'相同。
这将是一个解决方法?是否可以为此找到和LR语法?
提前致谢!
修改
我发现我认为是一种等效的语法,但我无法证明这一点。
我想我需要证明原始语法生成上面的语言,然后证明语言是为以下等效语法生成的。但我不知道该怎么做。我该怎么办?
S→aBS | bAS | ε
B→b | ABB
A→a | BAA
提前致谢...
PS:我已经证明这个新语法是LL(1),SLR(1),LR(1)和LALR(1)。
答案 0 :(得分:1)
除非语法与另一种语法直接相关 - 例如通过标准化转换,例如标准化,空类生成消除等等 - 证明两种语法派生相同的语言是非常困难的,而不知道语言是什么。通常(独立地)证明每种语法都可以推导出语言。
您提供的第一个语法:
S → aSbS | bSaS | ε
实际上确实导出了字母{a, b}*
上所有字符串的语言,其中 a 的数量与 b 的数量相同。我们可以在两个部分中证明:首先,语法识别的每个句子都具有该属性,其次,具有该属性的每个句子都可以通过该语法导出。这两个证据都是通过归纳进行的。
对于前向证明,我们通过归纳推导的数量来进行。假设我们有一些推导S → α → β → … → ω
,其中所有希腊字母代表非终端和终端的序列。
如果推导的长度恰好为零,那么它以S
开始和结束,那么任何派生句子中都没有终端,因此很清楚每个派生句子具有相同数量的 a s和 b s。 (基础步骤)
现在进行归纳步骤。假设已知长度i
的每个推导都以具有相同数量的 a 和 b s的派生句结束。我们想从这个前提证明长度i+1
的每个推导都以一个具有相同数量的 a 和 b s的句子结束。但这也很清楚:三个可能的生产步骤中的每一个都保持平价。
现在,让我们看一下相反的方向:每个具有相同数量的 a 和 b 的句子都可以从该语法中导出。我们将通过感应字符串的长度来做到这一点。我们的归纳前提是,如果是每个j ≤ i
,每个句子都具有j
a s和j
b s派生自S
,然后每个句子都有i+1
a s和i+1
b s。 (这里我们只考虑仅由终端组成的句子。)
考虑这样的问题。它以 a 或 b 开头。假设它以 a 开头:那么句子中至少有一个 b ,使得以 b 结尾的前缀具有相同的每个终端的号码。 (将字符串视为沿着正方形网格的步行:每个 a 沿对角线向上和向右移动一个单位,并且每个 b 沿对角线向下和向右移动。由于端点是在与开始点完全相同的高度并且图中没有虫洞,一旦我们提升,我们必须迟早回到起始高度,这是一个结尾 b 的前缀。)所以该前缀的内部(除了开头的 a 和结尾处的 b 之外的所有内容)是平衡的,字符串的其余部分也是如此。这两者都较短,因此通过归纳假设,它们可以来自S
。进行这些替换后,我们得到 a S b S ,它可以从S
导出。相同的参数适用于以 b 开头的字符串。同样,基本步骤是微不足道的。
所以这基本上就是你需要适应语法的证明程序。
祝你好运。顺便说一下,这类问题也可以在cs.stackexchange.com或math.stackexchange.com上提出,其中MathJax可用。 MathJax使得编写数学证明变得不那么繁琐,所以你很可能会发现你会得到更多可读答案。