上下文有关文法(1型)

比如:

aSb -> aaSbb

S -> ab

这就是上下文相关文法,因为它的第一个产生式左边有不止一个符号,所以你在匹配这个产生式中的S的时候必需确保这个S有正确的“上下文”,也就是左边的a和右边的b,所以叫上下文相关文法。

上下文无关文法(2型)

比如:

S -> aSb

S -> ab

上下文无关文法就是说这个文法中所有的产生式左边只有一个非终结符,这个文法有两个产生式,每个产生式左边只有一个非终结符S,这就是上下文无关文法,因为你只要找到符合产生式右边的串,就可以把它归约为对应的非终结符。

一个自然语言的例子:

上下文无关文法:

产生式:

Sent -> S V O

S -> 人 | 天

V -> 吃 | 下

O -> 雨 | 雪 | 饭 | 肉

其中英文字母都是非终结符(SVO 分别表示主谓宾),汉字都是终结符

这个文法可以生成如下句子(共 224=16 种组合,懒得写全了,简单写 7 种意思意思):

{人吃饭,天下雨,人吃肉,天下雪,人下雪,天下饭,天吃肉,……}

可以看到,其中有一些搭配在语义上是不恰当的,例如“天吃肉”。其(最左)推导过程为:

Sent -> SVO -> 天VO -> 天吃O -> 天吃肉

但是上下文无关文法里,因为有“V -> 吃 | 下”这样一条产生式,V 就永远都可以推出“吃”这个词,它并不在乎应用“V -> 吃 | 下”这个产生式进行推导时 V 所在的上下文(在这个例子里,就是”天VO“中 V 左右两边的字符串”天“和”O“)。事实上,在 V 推出“吃”这一步,它的左边是“天”这个词,而”天“和”吃“不搭配,导致最后的句子读起来很奇怪。

上下文有关文法:

产生式可以定义为(其中前两条产生式仍是上下文无关的,后四条则是上下文有关的):

Sent -> S V O

S -> 人 | 天

人V -> 人吃

天V -> 天下

下O -> 下雨 | 下雪

吃O -> 吃饭 | 吃肉

可以看到,这里对 V 的推导过程施加了约束:虽然 V 还是能推出”吃“和”下“两个词,但是仅仅当 V 左边是”人“时,才允许它推导出”吃“;而当 V 左边是”天“时,允许它推导出”下“。这样通过上下文的约束,就保证了主谓搭配的一致性。类似地,包含 O 的产生式也约束了动宾搭配的一致性。

这样一来,这个语言包含的句子就只有{人吃饭,天下雨,人吃肉,天下雪}这四条,都是语义上合理的。

以”人吃饭“为例,推导过程为:

Sent -> SVO -> 人VO -> 人吃O -> 人吃饭

其中第三步推导是这样的:非终结符 V 的上文是“人”,因此可以应用“人V -> 人吃”这条产生式,得到“人VO -> 人吃O”。第四步也类似。

参考:

应该如何理解「上下文无关文法」? - 知乎

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐