【问题标题】:Constructing a Context-Free Grammar from given Language从给定语言构建上下文无关语法
【发布时间】:2012-09-27 09:16:03
【问题描述】:

我在为给定语言构建 CFG 方面需要帮助。

L = { x ∈ {a, b}* | x != x reversed },换句话说,LL 中所有回文的补集。

我更感兴趣的是如何解决这类问题,而不是具体的解决方案。

【问题讨论】:

    标签: context-free-grammar automata


    【解决方案1】:

    嗯,我还没有想出解决此类问题的通用模式,但我想我知道如何解决这个问题:

    首先考虑回文语言 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 结束,所以我们在生成单词时肯定会输入不同的字母。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多