为以下语言{0^n w 1^n | n>=0 w is in {0,1}* and |w|=n}
尝试解决方案:
S--> 0S1|R
R--> 0R|1R|empty
不确定如何保证r的长度与0或1的数量相同。
答案 0 :(得分:2)
这没什么。
每个单词应如下所示:0 ^ n w 1 ^ n。因此,如果我们有规则S - > 0S1我们到达一个状态,我们可以从中生成的每个句子形式看起来像0 ^ n S 0 ^ n。
嗯......这不是我们想要的。不是吗?
我们更进一步,我们想要一些变量V,参与规则V - > 0 | 1(编辑:这可能是我们"目标",但事情可能出错,所以我们不会使用这两个规则),这使我们有可能使用S - > 0SV1而不是S-> 0S1。变化是什么?
现在我们得到这样的句子形式:0 ^ n S(V1)^ n。因此,例如000SV1V1V1将是一些这样的句子形式。我们现在肯定需要的一个小的补充是规则S - >空
尽管如此,我们毕竟还是希望它看起来更像是0 ^ nV ^ n1 ^ n。所以我们添加一个交换V和1的规则。所以我们加1V - > V1到规则集。现在有什么可能性?鉴于像000SV1V1V1这样的句型,我们现在可以将所有的V移到左边,将所有的1移到右边。
现在我们成为真正的语法纳粹分子。我们不希望出现任何问题,所以我们做了一些小改动。我们做了一点swippidy swappidy。我们将迄今为止我们所发生的S的每一次出现与T交换。所以S - > 0SV1变为0TV1等。此外,我们添加规则S - >空| T我们删除规则T - >空。我们从中获得了什么?嗯......一见钟情。但是,现在我们可以建立一种机制,确保当我们将V转变为1和0时,什么都不会出错。
我们只需添加规则TV - > C和CV - > CC。哦,耶稣基督,所有这些规则。
现在,给定一个句子形式0 ^ n T V ^ n 1 ^ n,我们可以将它慢慢地转换为0 ^ n C ^ n 1 ^ n。有什么用? 没有什么可以出错,如果我们可能没有把所有的V推到左边。 所以:像0000CCC1V111这样的句型不会对我们的事业造成任何伤害,因为我们无法对V做任何事情,除非它紧挨着C,我们也没有可能推动C的问题。 ,因为没有这样的规则。此外,由于我们要添加规则C - > 0 | 1,如果我们过早地将它们改为1和0,我们就无法完成我们的话,如果还有一个V浮动。
这可能根本不是必需的,我不确定,但它是我们证明的一部分,我们可以创建的所有单词都在我们想要用这个语法指定的单词集中。 规则是:
S -> empty | T
T -> 0TV1
1V -> V1
TV -> C
CV -> CC
C -> 0|1
编辑: 不过,这是一个Type-0 Grammer。 通过一些更改,这可以成为一个等效的CSG,但是:
S -> empty | T
T -> 0TV1 | 0C1
1V -> V1
CV -> CC
C -> 0 | 1
主要区别在于,我们在某些时候可以决定停止将0TV1添加到句子形式,而是用0C1完成,获得类似0 ^ n C1(V1)^(n-1)的形式。而且,如果我们过早地将所有C变为0和1,我们就失去了删除所有V的可能性。所以这也应该生成我们正在寻找的集合。
这也是我对stackoverflow的第一个答案,因为我有点喜欢计算机科学理论,我希望我的解释没有错。如果是这样,请告诉我。