【发布时间】:2012-09-27 09:16:03
【问题描述】:
我在为给定语言构建 CFG 方面需要帮助。
L = { x ∈ {a, b}* | x != x reversed },换句话说,L 是L 中所有回文的补集。
我更感兴趣的是如何解决这类问题,而不是具体的解决方案。
【问题讨论】:
标签: context-free-grammar automata
我在为给定语言构建 CFG 方面需要帮助。
L = { x ∈ {a, b}* | x != x reversed },换句话说,L 是L 中所有回文的补集。
我更感兴趣的是如何解决这类问题,而不是具体的解决方案。
【问题讨论】:
标签: context-free-grammar automata
嗯,我还没有想出解决此类问题的通用模式,但我想我知道如何解决这个问题:
首先考虑回文语言 L 的 CFG G(L)(让我们考虑二进制字母):
S -> ""
S -> "0" S "0"
S -> "1" S "1"
S -> "1" // odd length case
S -> "0" // odd length case
构造G(L)的想法是确保最后一个符号等于S中的第一个符号,因此,对于每个位置i,从开头的ith符号等于ith该语法产生的单词的末尾符号。
对于不是回文的单词w,我们希望确保存在i这样的位置,即从开头的ith符号不等于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 结束,所以我们在生成单词时肯定会输入不同的字母。
【讨论】: