我刚接受了期中考试,但无法回答这个问题。
有人可以提供一些语言示例,并为语言或构建语法 至少告诉我如何去做它?
如何为L
编写语法:
L = {a n b m | n,m = 0,1,2,...,n< = 2m}?
提前致谢。
答案 0 :(得分:7)
在阅读我的回答之前,您应先阅读:Tips for creating Context free grammars。
你是什么语言L = {a n b m | n,m = 0,1,2,...,n< = 2m}描述?
语言描述:
语言 L 由所有字符串组成,其中符号 a
后跟符号 b
,其中编号符号 b
的符号大于或等于 a
的一半。
更清楚地了解:
在模式 a n b m 中,首先符号 a
然后是符号 b
的。 a
的总数为n
, b
的数量为{{1 }}。不等式方程表示m
和n
之间的关系。要理解等式:
m
n 和 m 的不平等说:
numberOf( b )必须大于或等于至 numberOf( a )
L中的一些示例字符串:
given: n <= 2m
=> n/2 <= m means `m` should be = or > then n/2
=> numberOf(b) >= numberOf(a)/2 ...eq-1
因此,在语言字符串中,如果没有 b numberOf(a)=0 and numberOf(b)=1 this satisfy eq-1
bb numberOf(a)=0 and numberOf(b)=2 this satisfy eq-1
,则可以使用任意数量的 b
。 (任何b的字符串)因为任何数字都大于零(0/2 = 0)。
其他例子:
a
需要注意的要点:
以上所有字符串都是可能的,因为 m n
--------------
ab numberOf(a)=1 and numberOf(b)=1 > 1/2
abb numberOf(a)=1 and numberOf(b)=2 > 1/2
abbb numberOf(a)=1 and numberOf(b)=3 > 1/2
aabb numberOf(a)=2 and numberOf(b)=2 > 2/2 = 1
aaabb numberOf(a)=3 and numberOf(b)=2 > 3/2 = 1.5
aaaabb numberOf(a)=4 and numberOf(b)=2 = 4/2 = 2
的数量等于(=) {{1}的数量的一半} 或更多(&gt;)。
有趣的是要注意的是, b
总数还可以超过 a
的数量,但不是太多。而 a
的数量可以多于 b
的数量。< / p>
另外两个重要案例是:
仅b
字符串不可用。
注意: null a
字符串也是允许的,因为a
,^
满足等式。
一下子,看起来编写语法很难但实际上并非......
根据语言描述,我们需要遵循以下规则:
规则1 :生成^
空字符串。
numberOf(a) = numberOf(b) = 0
规则2 :生成任意数量的 ^
N --> ^
规则3 :生成 b
&#39; s:
(1)请记住,如果不生成 B --> bB | b
,则无法生成太多 a
。
(2)因为 a
超过 b
的一半;您需要为每个备用 b
生成一个 a
(3)只有b
字符串不可能,所以对于第一个(奇数)替代,您需要添加 a
和 a
(4)即使是替代方案,您可以放弃添加 b
(但不是强制)
所以你的整体语法:
a
此处b
是启动变量。
在上述语法规则中,您可能会在 S --> ^ | A | B
B --> bB | b
A --> aCB | aAB | ^
C --> aA | ^
中感到困惑,所以以下是我的解释:
S
让我们使用这个语法规则在语言中生成一些字符串,我正在编写最左边的派生以避免解释。
A --> aCB | aAB | ^
非成员字符串:
根据语言a 5 b 2 = A --> aCB | aAB | ^
^_____^
for second alternative a
C --> aA <== to discard `b`
and aAB to keep b
不可能。因为2> = 5/2 = 2.5 ==&gt; 2&gt; = 2.5不等式失败。所以我们也不能使用语法生成这个字符串。我尝试在下面显示:
在我们的语法中,为了生成额外的 ab S --> A --> aCB --> aB --> ab
abb S --> A --> aCB --> aB --> abB --> abb
abbb S --> A --> aCB --> aB --> abB --> abB --> abbB --> abbb
aabb S --> A --> aAB --> aaABB --> aaBB --> aabB --> aabb
aaabb S --> A --> aCB --> aaAB --> aaaABB --> aaaBB --> aaabB --> aaabb
aaaabb S --> A --> aCB --> aaAB --> aaaCBB --> aaaaABB --> aaaaBB
--> aaaabB
--> aaaabb
,我们必须使用C变量。
aaaaabb
虽然我的回答已经完成,但我认为您可以更改a
的规则,例如:
S --> A
--> aCB
--> aaAB
--> aa aCB B
--> aaa aA BB
--> aaaa aCB BB
---
^
here with firth `a` I have to put a `b` too
试一试!!
修改强>
as @ us2012评论说:在我看来,A
将是一个更简单的描述。我觉得这个问题对OP和其他人也有好处。
OP的语言:
L = {a n b m | n,m = 0,1,2,...,n <= 2m}。
@ us2012&#39;语法:
A --> aCB | A | ^
@ us2012&#39;问题:
这个语法是否也生成语言L?
答案是是的!
S -> ^ | ab | aaSb | Sb
&#39; s = S -> ^ | ab | aaSb | Sb
的数量与 a
= m的数量之间的语言不平等是n
我们也可以理解为:
b
在语法中,即使我们添加一个或两个 n =< 2m
,我们也会添加一个 n =< 2m
that is
numberOf(a) = < twice of numberOf(b)
。因此, a
的最终数量不能超过 b
的两倍。
语法也有生成规则。任意数量的 a
&n&lt; b
字符串。
因此@ us2012提供的简化语法是正确的,并且还完全生成语言L.
注意:第一个解决方案来自派生,因为我写的是链接的答案,我从语言描述开始,然后尝试编写一些基本规则,并逐步编写完整的语法。
虽然@ us2012的答案来自aptitude,但你可以通过阅读别人的解决方案和写你的语言来获得编写语法的能力。就像你学习编程一样。