给定以下语言构造语法 a^n b^m | n,m = 0,1,2,...,n <= 2m [关闭]
Posted
技术标签:
【中文标题】给定以下语言构造语法 a^n b^m | n,m = 0,1,2,...,n <= 2m [关闭]【英文标题】:Construct grammar given the following language a^n b^m | n,m = 0,1,2,...,n <= 2m [closed]给定以下语言构造语法 a^n b^m | n,m = 0,1,2,...,n <= 2m [关闭] 【发布时间】:2013-03-11 15:49:20 【问题描述】:我刚参加了期中考试,但无法回答这个问题。
有人可以举几个语言的例子并为语言构造语法或 至少告诉我我会怎么做?
还有L
的语法怎么写:
L = an bm | n,m = 0,1,2,..., n
提前致谢。
【问题讨论】:
问问你的助教或者教授不是更好吗? 不,我们这些天都去 *** 上,包括家庭作业解决方案。 它清楚地表明这是一个中期问题。我现在在春假,所以我不能问我的教授。不过还是谢谢。 @user2197126 实际上您的问题非常好,但是您在错误的堆栈溢出表单上提出了one more site,您可以在其中提出理论问题。这种形式更多地与编程相关。虽然,我已经添加了我的答案,希望对您有所帮助。 【参考方案1】:形式语言的语法怎么写?
在阅读我的这个答案之前,您应该先阅读:Tips for creating Context free grammars。
an bm 的语法 | n,m = 0,1,2,..., n
你是什么语言 L = an bm | n,m = 0,1,2,..., n
你是什么语言 L = an bm | n,m = 0,1,2,..., n
语言描述:
语言 L 由所有字符串组成,其中符号 a
后跟符号 b
,其中符号的数量 b
大于或等于 a
数量的 一半。
为了更清楚地理解:
在模式 an bm 中,第一个符号 a
出现,然后是符号 @ 987654327@。 a
的总数为 n
,b
的总数为 m
。不等式表示n
和m
之间的关系。理解方程式:
given: n <= 2m
=> n/2 <= m means `m` should be = or > then n/2
=> numberOf(b) >= numberOf(a)/2 ...eq-1
所以 n 和 m 的不等式说:
numberOf(b) 必须大于或等于到 一半 numberOf(a)
L 中的一些示例字符串:
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
都可能没有 a
。 (b 的任何字符串) 因为任何数字都大于零 (0/2 = 0)。
其他例子:
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
注意事项:
以上所有字符串都是可能的,因为 b
的数量等于 (=) 等于 a
数量的一半 或 更多 (>)。
有趣的一点是,a
的总数也可以多于 b
的数量,但不要太多。而 b
的数量可以比 a
的数量多任意倍。
两个比较重要的案例是:
不可能仅将a
作为字符串。
注意: null ^
字符串也是允许的,因为在 ^
, numberOf(a) = numberOf(b) = 0
中满足方程。
乍一看,写语法很难,其实不然……
根据语言描述,我们需要以下几种规则:
规则1:生成^
空字符串。
N --> ^
规则2:生成任意数量的b
B --> bB | b
规则 3:生成 a
的:
(1) 请记住,如果不生成 b
,则不能生成太多 a
。
(2) 因为 b
的数量多于 a
的一半;您需要为每个备用 a
生成一个 b
(3) 只有a
作为字符串是不可能的,因此对于第一个(奇数)替代方案,您需要添加 b
和 a
(4) 而对于替代方案,您可以放弃添加b
(但不是强制)
所以你的整体语法:
S --> ^ | A | B
B --> bB | b
A --> aCB | aAB | ^
C --> aA | ^
这里S
是开始变量。
上面的语法规则你可能对A --> aCB | aAB | ^
有混淆,下面是我的解释:
A --> aCB | aAB | ^
^_____^
for second alternative a
C --> aA <== to discard `b`
and aAB to keep b
让我们使用这个语法规则生成一些语言中的字符串,我正在写最左派生以避免解释。
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
非会员字符串还有一个:
根据语言 a5 b2 = aaaaabb
不可能。因为 2 >= 5/2 = 2.5 ==> 2 >= 2.5 不等式失败。所以我们也不能使用语法生成这个字符串。我尝试在下面显示:
在我们的语法中,要生成额外的a
,我们必须使用 C 变量。
S --> A
--> aCB
--> aaAB
--> aa aCB B
--> aaa aA BB
--> aaaa aCB BB
---
^
here with first `a` I have to put a `b` too
虽然我的回答已经完成,但我认为您可以更改 A
的规则,例如:
A --> aCB | A | ^
试试看!!
编辑:@us2012 评论:在我看来,S -> ^ | ab | aaSb | Sb
将是一个更简单的描述。我觉得这个问题对 OP 和其他人也有好处。
OP 的语言:
L = an bm | n,m = 0,1,2,..., n
@us2012 的语法:
S -> ^ | ab | aaSb | Sb
@us2012 的问题:
这个语法是否也生成语言L?
答案是是的!
a
的数量 = n
和 b
的数量 = m 之间的语言不等式是 n =< 2m
我们也可以理解为:
n =< 2m
that is
numberOf(a) = < twice of numberOf(b)
而在语法中,即使我们添加 one 或 two a
,我们也会添加 one b
。所以最终 a
的数量不能超过 b
的数量的两倍。
语法也有规则要生成。任意数量的 b
和 null ^
字符串。
所以@us2012 提供的简化语法是正确的,也准确地生成了语言L。
注意:第一个解决方案来自于我在链接答案中写的推导,我从语言描述开始,然后尝试编写一些基本规则,逐步我可以编写完整的语法。
@us2012 的答案来自 aptitude,您可以通过阅读其他人的解决方案并为某些人编写自己的解决方案来获得编写语法的能力 - 就像您学习编程的方式一样。
【讨论】:
如果您对此有更多疑问/疑问,或者我的回答有误,希望没有 嗯,当我第一次阅读语言定义时,我以为它包括m = 0,1,2,...,n
,即 m <= n
- 但也许我一直读错了。
无论如何,假设你是对的:在我看来,S -> ^ | ab | aaSb | Sb
将是一个更简单的描述 - 我错过了什么吗?
@us2012 是的,您的语法是正确的。阅读更新的答案。
非常感谢 Grijesh 的回答 - 令人惊叹的解释!以上是关于给定以下语言构造语法 a^n b^m | n,m = 0,1,2,...,n <= 2m [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
2023-02-12:给定正数N,表示用户数量,用户编号从0~N-1, 给定正数M,表示实验数量,实验编号从0~M-1, 给定长度为N的二维数组A, A[i] = { a, b, c }表示,用户i报
ZZNUOJ_用C语言编写程序实现1149:查找子数组(附完整源码)
L = a^n a^n b^m |m, n ≥ 0 是规则语言还是不规则语言?
2022-08-21:以下go语言代码输出什么?A:0;B:panic;C:不知道。 package main var n = -99 func main() { m := make(map[