龙书练习4.2.3 f:两个半场不同的弦乐的语法

时间:2018-06-18 06:08:22

标签: compiler-construction computer-science

我可以自己解决4.2.3 a~e,但是f对我来说太难了,我甚至无法使用google找到答案。

  

为以下语言设计语法:

     

(f)xy形式的0和1的所有字符串的集合,其中x≠y,x和y具有相同的长度

1 个答案:

答案 0 :(得分:1)

这种语言的有趣之处在于它与

的关系

Ldup = { ωω | ω ∈ Σ*}

这是一种非上下文语言的经典示例。但是练习中的语言

Ldiff = { γζ | γ ≠ ζ ∧ γ ∈ Σ* ∧ ζ ∈ Σ* }

具有

的属性

Ldiff ⋃ Ldup ⋃ Lodd = Σ* and Ldup, Ldiff, Lodd are disjoint.

,其中

Lodd = { ω | |ω| is odd ∧ ω ∈ Σ*}

换句话说,如果将一个字符串拆分成两个相等长度的部分,则这两个部分是相等或不相等的,如果你不能这样分割字符串,它的长度就是奇数。

L odd 显然是无上下文的 - 事实上,它是规则的 - 所以L diff 无上下文这一事实导致了补语的结论无上下文的语言可能不是无上下文的。

鉴于此,将L diff 视为由两个等长片γζ组成是很自然的。但这解决了问题的方式,即使不是不可能,也很难解决。正如许多数学问题(并且,我敢说,现实问题)一样,解决方案必须首先重构问题以揭示其潜在的简单性。 (“在盒子外面思考”,使用着名的陈词滥调。)

假设γζ的长度均为 n 。由于它们不同,它们必须至少在一个位置上有所不同。假设 k 是这样一个位置,因此γ k ζ k

现在,让我们尝试表征满足该约束的字符串对。除 k 位置之外的所有符号都是无关紧要的,所以我们最终得到的是:

ΣkγkΣn-k-1 ΣkζkΣn-k-1

这显然与

相同

ΣkγkΣk Σn-k-1ζkΣn-k-1

并让 j = n - k -1, a =γ k b =ζ k ,我们得到

Σkk Σjj, a ≠ b

j k 两个符号 a b 在该表达式中都是任意的。因此,实际上,我们已经描述了可以被分成两个奇数长度部分的字符串集合,使得两个部分中间的符号不同。对于二进制字符串,只有两对符号不同:<0, 1><1, 0>。这导致了以下语法:

W → 0 | 1               /* Wildcard */
A → 0 | W A W           /* Strings with a 0 in the middle */
B → 1 | W B W           /* Strings with a 1 in the middle */
S → A B | B A           /* Ldiff */