龙书习题4.2.3 f:两半不同的字符串的文法

Dragon book exercise 4.2.3 f: Grammar for strings whose two halfs differ

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

Design grammars for the following languages:

(f) The set of all strings of 0s and 1s of the form xy, where x ≠ y and x and y are of the same length

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

的关系

L<sub>dup</sub> = { ωω | ω∈ Σ<sup>*</sup>}

这是非上下文无关语言的典型例子。但是练习中的语言

L<sub>diff</sub> = { γζ | γ ≠ ζ ∧ γ ∈ Σ<sup>*</sup> ∧ ζ ∈ Σ<sup>*</sup>}

有 属性

L<sub>diff</sub> ⋃ L<sub>dup</sub> ⋃ L<sub>奇数</sub> = Σ<sup>*</sup> 和 L<sub>dup</sub>, L<sub>diff</sub>, L<sub>odd</sub> 是不相交的。

哪里

L<sub>奇数</sub> = { ω | |ω|是奇数 ∧ ω ∈ Σ<sup>*</sup>}

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

Lodd 显然是上下文无关的——事实上,它是规则的——所以 Ldiff 是上下文的事实free 得出的结论是上下文无关语言的补语可能不是上下文无关的。

鉴于此,很自然地认为 Ldiff 是由两个等长的片段 γζ。但这以一种使问题难以解决(如果不是不可能的话)的方式来界定问题。与许多数学问题(我敢说,现实世界的问题)一样,解决方案必须从重构问题开始,以揭示其潜在的简单性。 ("Thinking outside of the box",套用著名的陈词滥调。)

假设γζ的长度都是n。既然不同,那么至少在一个位置上肯定是不同的。假设k是这样一个位置,使得γkζ k.

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

Σ<sup>k</sup>γ<sub>k</sub>Σ<sup>n-k-1</sup>Σ<sup>k</sup>ζ<sub>k</sub>Σ<sup>n-k-1</sup>

这显然与

相同

Σ<sup>k</sup>γ<sub>k</sub>Σ<sup>k</sup>Σ<sup>n-k-1</sup>ζ<sub>k</sub>Σ<sup>n-k-1</sup>

并让j等于; nk−1, a = γkb = ζk,我们得到

Σ<sup>k</sup>aΣ<sup>k</sup>Σ<sup>j</sup>bΣ<sup>j</sup>,a≠b

jk 以及两个符号 ab 在那个表达式中都是任意的。所以实际上,我们已经描述了一组字符串,它可以被分成两个奇数长度的部分,使得两个部分中间的符号不同。对于二进制字符串,只有两对不同的符号:<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           /* L<sub>diff</sub> */