L = {2 ^ x * 2 ^ y * 2 ^ z = 2 ^(x + y + z)|的无上下文语法x,y,z> 0}

时间:2017-04-30 16:15:51

标签: context-free-grammar context-free-language

标题解释了它。我无法同步"等式的左侧"正确的,当我在左边生成2时,右边的一个必须出现。可能是这种语言没有上下文吗? 提前谢谢!

L = {2^x ∗ 2^y ∗ 2^z = 2^(x+y+z) | x, y, z > 0}

编辑:这与数学方程无关。 " *"和" ="仅仅是语言字母表的符号,而且是#34; x"的强大功能。暗示2被重复x次。

Example of this language:
222*2*22=222222 
2*2*2=222
2*222222*22=222222222

3 个答案:

答案 0 :(得分:1)

使用关于乘法字符串连接和指数重复的基本事实,我们可以将您的语言重新定义为:

L = { 2^x * 2^y * 2^z = 2^z 2^y 2^x | x, y, z > 0 }

这种语言定义可以进一步阐述为:

Lz = { 2^z = 2^z | z > 0 }
Ly = { 2^y * w 2^y | y > 0, w ∈ Lz }
Lx = { 2^x * w 2^x | x > 0, w ∈ Ly }
L = Lx

然后我们可以为Lz定义一个语法:

Z   ::=   2 = 2
Z   ::=   2 Z 2

一个是Ly:

{ include Lz's grammar }
Y   ::=   2 * Z 2
Y   ::=   2 Y 2

一个用于Lx:

{ include Ly's grammar }
X   ::=   2 * Y 2
X   ::=   2 X 2

由于L = Lx,组合语法的起始符号为X

答案 1 :(得分:0)

不要让它变得比它需要的更难。您的语言具有以下特征:

  1. 中间有=
  2. LHS以2开头和结尾,中间有2 s和*
  3. RHS只是2 s
  4. LHS和RHS上2的数量相等
  5. LHS不包含**
  6. 这些规则很容易用到语法中:

    (P1) S -> 2=2
    (P2) S -> 2S2
    (P3) S -> 2*S2
    

    第一条规则是我们的基本情况,并确定=必须始终将LHSRHS分开。它还确定LHS必须以2结尾,并且RHS必须以2开头。

    第二个和第三个规则允许我们添加更多2来获取语言中更长的字符串。第二条规则说"你总是可以在LHS的前面放一个2,如果你这样做,你必须把一个放在RHS的末端"。第三条规则允许我们将*放入LHS,只要我们在RHS上放置至少一个S"。

    您的示例:

    222*2*22=222222 
    S
    2S2                    P2
    22S22                  P2
    222*S222               P3
    222*2*S2222            P3
    222*2*2S22222          P2
    222*2*22=222222        P1
    
    2*2*2=222
    S                 
    2*S2                   P2
    2*2*S22                P2
    2*2*2=222              P3
    
    2*222222*22=222222222
    S
    2*S2                   P3 
    2*2S22                 P2
    2*22S222               P2
    2*222S2222             P2
    2*2222S22222           P2
    2*22222S222222         P2
    2*222222*S2222222      P3
    2*222222*2S22222222    P2
    2*222222*22=222222222  P1
    

    这种语法的形式正确性证据将涉及显示(a)生成语言中的每个字符串,以及(2)生成的每个字符串都使用该语言。我们可以使用归纳法做到这两点:

    证明:通过归纳。 基本情况:语言中最短的字符串是2=2,由P1生成。没有更短的生成字符串。 归纳假设:假设所有长度小于k的字符串都是在语言中生成的(这些集合长度相同,长度为k)。 归纳步骤:我们必须显示长度大于k的字符串也是一致的。如果我们在语言中有一个长度为k或更长的字符串(或者由语法生成),则其格式必须为22x222*x2,其中x是另一个字符串语言(或者,由语法生成)。 x的长度小于k,或者此参数以递归方式应用于x本身。由于x的长度小于k,因此归纳假设意味着它可以由语法生成(或者,它在语言中);因此,可以生成两种形式(或者,使用语言):P2的两个应用程序和P3的一个应用程序(或者,通过语言本身的定义)。

    更新:

    一条评论引起我的注意,*的数量应固定为2.这需要改变语法的定义:

    S -> 2S2 | 2*R2
    R -> 2R2 | 2*T2
    T -> 2T2 | 2=2
    

    这会以相对较小且可预测的方式改变上述论点。基本上,我们会跟踪P3的应用程序数量,并在第二个应用程序之后禁止进一步的应用程序,同时在我们看到至少两个应用程序之后只允许消除所有非终端应用程序。

答案 2 :(得分:-1)

以下是无上下文语法的示例,其中222*2*22=2222222*2*2=222等字符串具有语法性。

<literal>: 2 | <literal>2;
<number>: <literal> | <number>*<number>;
<expression>: <number>=<number>;

通过这些制作,您想要的字符串都是有效的<expression>。字符串错误&#34;也是语法,如:

22=2

我不清楚你的问题是否是一个问题。我可以想象你的项目中的第一个业务顺序是解析字符串而不用担心语义,然后评估语法字符串的语义。

编辑:我很想知道我的回答是否确实有问题,或者我刚刚收到了#34;留下了我的地盘&#34; #34; downvote。

相关问题