【问题标题】:Context-free grammar for the language L = {a^(n)b^(m)c^(k): m = |i - k|}语言 L = {a^(n)b^(m)c^(k): m = |i - k|} 的上下文无关文法
【发布时间】:2019-04-14 03:03:00
【问题描述】:

我有这种语言L = {a^n b^m c^k: m = |n - k|}

我知道m = |n - k|可以用两种方式表达 1) m = n - k for n >= k or n = m + k 2) m = k - n for k >= n or k = m + n
因此,我得到了两种语言,其中
L1 = {a^n b^m c^k: n = m + k}L2 = {a^n b^m c^k: k = m + n}
然后我声称L 是两者的结合,L = L1 U L2

我不太明白如何生成一个语法,其中一个终端的一个指数是其他两个终端的总和。即,在L1 中有n = m + k
L1 也可以进一步简化为
a^n => a^(m+k) => a^(m)a^(k) 所以 L1 变成
L1 = {a^m a^k b^m c^k: m, k >= 0}

尝试回答 L1 = {a^m a^k b^m c^k: m, k >= 0}
一个语法G1
S -> A|B
A -> aAb|lambda
B -> aBc|lambda

【问题讨论】:

  • 我投票结束这个问题,因为它不是关于计算机编程的。
  • 有没有办法把它移到另一个站点?也许在 CS 堆栈交换或数学中。

标签: context-free-grammar regular-language formal-languages context-free-language


【解决方案1】:

对于L1,您可以使用

S -> aSc
S -> T
T -> aTb
T -> 

与 L2 类似。

【讨论】:

    【解决方案2】:

    a^n b^n:

    考虑 CFG:

    S ::= aSb | <empty string>
    

    这会生成所有字符串a^n b^n,具有正确匹配的指数。这样做的原因是使用此语法添加a 还需要添加额外的b;通过确保每个产生式都保留所需的属性(as 的数量与 bs 的数量相同),我们确保了(通过归纳,因为该属性最初成立,并且每个产生式都保留它) 它将适用于我们从语法生成的每个句子。

    a^n b^m c^(n+m):

    如果我们想创建一个语法来生成稍微复杂的a^n b^m c^(n+m),我们可以应用类似的推理:我们在语法结构中编码,添加ab需要添加@987654332 @:

    S ::= aSc | T | <empty string>
    T ::= bTc | <empty string>
    

    同样,由于每个产生式都保留了我们想要的属性(cs 的数量是as 的数量加上bs 的数量),它适用于我们在语法中生成的任何句子.

    您可以应用类似的推理来找出将保留您在 OP 中提到的其他数学属性的语法。

    【讨论】:

    • 我了解S ::= aScT ::= bTc 部分,但你能解释一下你的第一部作品中的S -&gt; T 是什么[S ::= aSc | T | &lt;empty string&gt;]。
    • | 是显示S 不同可能右侧的简写。语法等价于:S ::= aSc; S ::= T; S ::= &lt;empty string&gt;; T ::= bTc; T ::= &lt;empty string&gt; 其中S 是开始符号,T 只是语法中的另一个非终结符号,如原帖中的AB。我们需要另一个非终结符的原因是确保在添加所有bs 之前添加所有as;如果我们只使用S,我们最终会生成像bacc 这样的字符串。
    • 我明白了,所以非终结符T 用于将ST 连接在一起。
    • 我想你可以这么说。
    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 2018-04-18
    • 2021-08-30
    • 2021-08-31
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多