【问题标题】:Construct CFG from {w element of {a, b}* : 2#a(w)=3#b(w)}从 {a, b}* 的 {w 元素构造 CFG:2#a(w)=3#b(w)}
【发布时间】:2020-03-20 07:01:47
【问题描述】:
如果我有以下语言 { x 是 {a,b}* 的元素,其中 2#a(x)=3#b(x),那么该语言的 cfg 是:
S=>SaSaSaSbSbS |SaSaSbSaSbS|SaSaSbSbSaS | SaSbSaSaSbS| SaSbSaSbSaS | SaSbSbSaS |SbSaSaSaSbS |SbSaSaSbSaS |SbSaSbSaS |SbSbSaSaSaS | ε/λ
这是正确的吗?如果这不正确/还有另一种更简单的形式,你能告诉它吗?除此之外,我对其他形式一无所知。
【问题讨论】:
标签:
grammar
context-free-grammar
computation-theory
【解决方案1】:
乍一看,这可能有效:
您的基本情况很好;空字符串是语言
您涵盖了所有归纳案例:您只需添加 2 a 和 3 b 即可涵盖所有安排
我没有看到比这更简单的解决方案,尽管您可以从所有产生式的右侧删除前导或尾随 S;然后,通过选择一个产品,您将致力于第一个或最后一个终端符号,但我认为这仍然有效。甚至可能同时删除前导和尾随 S,以便您同时承诺第一个和最后一个。任何其他简化似乎都会增加产生式的数量或非终结符的数量,或两者兼而有之,虽然这可能会减少编码语法所需的符号总数,但可以说不会使语法变得更简单(实际上,更多的非终结符和产品通常被视为更复杂,而不是更少)。如果您想尝试添加产生式或非终结符,请考虑例如T => Sa 和 R => Sb,只是为了减少重复。