形式语言的语法怎么写?
在阅读我的这个答案之前,您应该先阅读:Tips for creating Context free grammars。
{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
注意事项:
两个比较重要的案例是:
乍一看,写语法很难,其实不然……
根据语言描述,我们需要以下几种规则:
规则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,您可以通过阅读其他人的解决方案并为某些人编写自己的解决方案来获得编写语法的能力 - 就像您学习编程的方式一样。