我已经尝试过,并且在Discrete Mathematics and its Applications(Rosen)中烧毁了我的大脑以理解常规语言的定义,而没有达到理解为什么定义与本书中的定义相同的目标。在页面(789),我重新定义定义:
类型3语法定义为:
w1 --> w2
其中w1是非终端,w2的格式为:
w2 = aB
w2 = a
其中B是非终端,a是终端。一个特例是当w1是起始符号而w2是lambda(空字符串)时:
w1 = S
S --> lambda
我无法找到答案的两个问题。首先,为什么 w2 不能采用 Ba 的形式。其次,为什么 lambda 仅允许用于起始符号 。该书指出,常规语言相当于有限状态自动机,我们可以很容易地看到我们可以为这两种情况构建FSA。我查看了其他资源,这些资源中没有这些限制。
答案 0 :(得分:5)
首先,为什么w2不能成为Ba的形式。
以W作为起始符号采用以下语法:
W -> lambda
W -> aX
X -> Wb
它生成{a n b n :n natural},这不是常规语言。因此,如果您只想生成常规语言,则此限制至关重要。或者,您可以允许w2 = Ba,但禁止类型规则w2 = aB - 这也提供常规语言。该语法将构建一个“向后”的词。
如果您允许这两种类型的规则,您将获得一个名为linear languages的类。
其次,为什么lambda仅允许用于起始符号。
这不是必要的限制。
你可以消除lambda对非终结符号的所有使用:采取一些规则W - > lambda,删除它,并替换所有规则U - > aW与U - >; aW和U - >一个。显然你无法消除使用lambda作为终端符号(该语言不再产生空字)。
因此,在许多地方使用lambda的每个类型3语法都可以“标准化”为仅使用lambda作为起始符号的语法。