【问题标题】:Why the need for terminals? Is my solution sufficient enough?为什么需要终端?我的解决方案是否足够?
【发布时间】:2013-04-13 15:05:24
【问题描述】:

我正在尝试了解上下文无关语法,我想我已经接近了。让我困惑的是这个问题(我正在做练习题,因为我有一个月的考试时间):

我想出了这种语言,但我认为它是错误的。

S --> aSb | A | B
A --> aA | Σ
B --> bB | Σ

显然这是正确的解决方案:

S --> aSb | aA | bB
A --> aA | Σ
B --> bB | Σ

我不太明白为什么我们有S --> aSb | aA | bB 而不仅仅是S --> aSb | A | B。终端需要什么?我不能直接打电话给 A 并以这种方式抓住我的终端吗?

测试能否生成字符串:aaabbbb

S --> aSb --> aaSbb --> aaaSbbb --> aaaBbbb --> aaabbbb

我相信我正确地生成了字符串,但我不太确定。我告诉自己S --> aSb | aA | bB 的原因是,如果我们以aA 开头,然后用a 替换A,我们有两个a,这给了我们正确的字符串,因为它们是不相等,这也可以用 b 来完成。非常感谢任何建议。

进入元组(G-4-tuple)

V(无终端)= {A, B}
Σ(终端)= {a, b}
P = { } // 不太确定如何在 R 中表达我的解决方案?我必须使用测试字符串吗?
S = A

【问题讨论】:

  • 感谢,谢谢!
  • 好的阅读知道更新了一些理论上的标准术语..

标签: grammar context-free-grammar


【解决方案1】:

第一:

  1. Σ 表示语言符号。用你的语言Σ = {a, b}
  2. ^ 表示空符号(这是理论上的,^ 不是任何语言符号的成员)
  3. ε 表示空字符串(这是理论上的,ε 可以是某种语言的成员)

^ 符号没有任何意义,但我们只是将它用于理论目的,就像我们在数学中使用的 无穷大符号(实际上没有数字是,但我们用它来理解,证明一些定理)类似^ 只是我们使用它。
这点没有写在任何书上,我写它是为了解释/理解观点。该学科更多属于理论和数学,我来自计算机科学。

正如你所说,你的语法是L = {a<sup>m</sup> b<sup>n</sup> | m != n}。假设产生式如下:
首先:

S --> aSb | A | B
A --> aA | Σ
B --> bB | Σ

意思是。(非常稀有的书可能在语法规则中使用Σ

S --> aSb | A | B
A --> aA | a | b
B --> bB | a | b

我将 Σ 替换为 a | bab 语言符号)。

此语法可以生成相同数量的符号a 和符号b(a<sup>n</sup> b<sup>n</sup>) 的字符串。它如何生成a<sup>n</sup> b<sup>n</sup>?请参阅下面的示例推导:

S ---> aSb ---> aAb ---> aaAb ---> aabb  
   ^        ^        ^           ^
rule-1      S-->A    A--> aA     A --> b

但是这种字符串在语言 L 中是不可能的,因为 m != n。

第二:
出于同样的原因,如果A --&gt; aA | ΣB --&gt; bB | Σ 在语法中,则生产规则S --&gt; aSb | aA | bB 也不是正确的语法。

我认为在第二种语法中你的意思是:

S --> aSb | aA | bB
A --> aA  | ^
B --> bB  | ^ 

那么这是语言L = {a<sup>m</sup> b<sup>n</sup> | m != n} 的正确语法。因为使用:

S --> aSb  

您只能生成相同数量的 a'b 并通过将 S 替换为 aAbB 您制作一种句子形式,其中存在不相等数量的 ab 符号,并且无法转换回生成 a<sup>n</sup> b<sup>n</sup> 类型的字符串。 (因为A 不会生成bB 不会生成a)。

第三:
但通常我们会写这样的语法规则:

S --> aSb | A | B
A --> aA | a
B --> bB | b

两种形式是等效的(生成相同的语言L = {a<sup>m</sup> b<sup>n</sup> | m != n}),因为一旦将S 转换为AB,您必须至少生成一个ab(或更多)分别,因此约束 m != n 成立。

记住校对,两个语法是否等价是undecidable problem。我们无法通过 算法证明它(但在逻辑上是可行的,因为我们人类的大脑比处理器更好:P :))。

第四:
最后我还要补充一句,语法:

S --> aSb | A | B
A --> aA | ^
B --> bB | ^

不会生成L = {a<sup>m</sup> b<sup>n</sup> | m != n},因为我们可以生成a<sup>n</sup> b<sup>n</sup>,例如:

S ---> aSb ---> aAb ---> ab
                     ^
                     A --> ^ 

正式语言的语法

任何class of formal languages 都可以用由四元组(S, V, Σ, P) 组成的正式语法来表示。 (注意语法或自动机都是有限表示天气语言是有限或无限的:检查数字onetwo)。

  1. Σ:有限的语言符号集。
    在语法中,我们通常称之为终端的有限集(与变量V相反)。语言符号或终端是事物,使用它们构造语言字符串(句子)。在您的示例终端集Σ{a, b}。在自然语言中,您可以将终端与词汇或字典单词相关联。
    自然语言是指我们所说的印地语、英语

  2. V:非终结符的有限集。
    非终结符或说“变量”,应始终参与语法产生规则。 (否则变量会计入无用变量,即不派生终结符或什么都没有的变量)。
    请参阅:'语法的最终目标是正确生成语言的字符串因此,每个变量都应该以某种方式有用。
    在自然语言中,您可以将变量集与定义语言的特定语义属性的名词/动词/十位相关联(例如动词表示吃/睡觉,名词表示他/她/Xiy 等)。
    注意:在一些书籍中可以找到V ∩ Σ = ∅,这意味着变量不是终结符。

  3. S:开始变量。 (S ∈ V)
    S是一个特殊的变量符号,称为“起始符号”。如果字符串可以从起始变量S 派生,我们只能考虑语法 L(G) 语言中的字符串。如果一个字符串不能从S派生出来(即使它由语言符号Σ组成),那么在语法语言中将不考虑字符串(实际上该字符串属于L(G)的“补语”,我们写补充语言L<sup><strong>'</strong></sup> = Σ<sup>*</sup> - L(G),检查:"the complement language in case of regular language")

  4. P:生产规则的有限集。
    生产规则在fromα --&gt; β中定义了替换规则,这意味着在从S推导字符串的过程中,从语法规则中随时α(lhs)可以被β(rhs)替换。(this类似于自然语言中的名词可以替换为he、she或Xiy,动词可以替换为吃、睡等。
    产生规则定义了语言句子的形成规则。形式语言类似于自然语言,具有某种模式,即某种事物可以以某种形式出现——我们在编程语言中称之为语法。并且由于这种语法能力,用于语法检查的语法称为 parse)。
    注意α --&gt; βαβ 都由语言符号和终端@ 组成987654399@ 有一个约束,即在α 中,它们必须至少是一个变量。 (因为我们只能用规则的 rhs 替换包含变量的字符串。一个终端不能被另一个终端替换,或者我们可以说一个句子不能被另一个句子替换
    记住:字符串有两种形式Sentential Form and Sentence

    • Sentence: 如果所有符号都是终结符(句子可以是 L(G) 或补语L<sup><strong>'</strong></sup> = Σ<sup>*</sup> - L
    • Sentential: 如果任何符号是可变的(不是语言字符串而是派生字符串)

来自@MAV(谢谢!!):
表示上述语言L = {a<sup>m</sup> b<sup>n</sup> | m != n}的语法,4元组是:

V = {S, A, B}
Σ = {a, b}
P = {S --&gt; aSb | A | B, A --&gt; aA | a, B --&gt; bB | a}
S = S

注意:一般我用P 表示Production 规则,你的书可以用R 表示rules

形式语言理论中的术语使用和自动化

  • 大写字母用于变量,例如语法结构中的 S、A、B。
  • 开头的小字母用于终端(语言符号),例如ab。 (一些时间数字,如 01 使用。^ 也是空符号)。
  • 小写字母形式最后用于终端字符串zywx(例如,您可以在泵引理中找到这些符号, 符号用于语言字符串或子字符串)。
  • α, β, γSentential forms
  • Σ 用于语言符号。
  • Γ 用于输入或输出抽头符号,除语言符号外。
  • ^ 为空符号,# 图灵机和 PDA 中的空白符号符号(^# 是其他语言符号。
  • ε 用于空字符串(可以是语言字符串的一部分,例如 { }C 语言中的空正文,您可以编写 while(1);while(1){ } 都是有效的see here I have defined a valid program with empty sentences)。
  • 表示empty set in set theory
  • ΦΨ 用于句子形式的子字符串。

注意 表示集合为空,ε 表示字符串为空,^ 表示无符号(理论上不要混用,语义不同)

我不知道关于符号表示法的规则,但这些是我在学习期间观察到的大多数标准书籍中曾经可以找到的常用术语。

下一篇:Tips for writing Context free grammar

【讨论】:

  • 当然,非常感谢所有帮助!
  • @Xiy V 是你的非终结符 = {S, A, B}E 是您的终端 = {a, b}R 是你的所有规则 = {S --&gt; aSb | A | B, A --&gt; aA | a, B --&gt; bB | a} 并且 S 是你的开始非终结符 = S。希望这是有道理的。 :)
  • @GrijeshChauhan 好的。尽管我的编辑由于某种原因被拒绝,但我想给 Xiy 一个回答他的问题。 :) 我喜欢你的回答。
  • @Xiy 你总是为 two b 生成 three a 。比如S --&gt; aaaSbb .....等等我在写。
  • 我明白了,太棒了,谢谢你们俩的帮助。我真的很感激。
猜你喜欢
  • 1970-01-01
  • 2011-01-28
  • 2012-03-09
  • 2016-03-31
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2019-11-17
  • 2019-09-30
相关资源
最近更新 更多