我需要帮助为给定语言构建CFG。
L = { x ∈ {a, b}* | x != x reversed }
,换句话说,L
是L
中所有回文的补充。
我对如何解决这些问题而不是具体的解决方案更感兴趣。
答案 0 :(得分:2)
好吧,我还没有找到解决这些问题的常用模式,但我想我知道如何解决这个问题:
首先考虑用于回文语言G(L)
的CFG L
(让我们考虑二进制字母表):
S -> ""
S -> "0" S "0"
S -> "1" S "1"
S -> "1" // odd length case
S -> "0" // odd length case
构建G(L)
的想法是确保最后一个符号等于S中的第一个符号,因此,对于每个位置i
,i
符号从头开始是相等的从该语法产生的单词到结尾的i
符号。
对于不是回文的单词w
,我们希望确保有一个位置i
,从开头的i
符号不等于最后的i
符号。所以,只有在我们在生产的开始和结束时放入不同的字母后才允许终止文字生成:
S -> "0" S "0"
S -> "1" S "1"
S -> "0" T "1"
S -> "1" T "0"
T -> ""
T -> "0" T "0"
T -> "1" T "1"
T -> "0" T "1" // we are allowed to put different symbols more than once
T -> "1" T "0" // we are allowed to put different symbols more than once
T -> "0"
T -> "1"
你可以给S
国家的意思«我们还没有写不同的字母»,T
«我们已经写了不同的字母»的含义。请注意,我已删除此CFG中的S -> ""
规则,因此我们只会从T
完成,因此我们肯定会在生成单词时输入不同的字母。