【发布时间】:2014-05-29 09:50:47
【问题描述】:
我有点被自动机和语法问题困扰。我搜索了很多,但没有任何成功。
是否有可能构造一个生成这种语言 L 的语法?
L = { a<sup>(2<sup>i</sup>)</sup> | i >= 0}
谁能给我一个简单的解决方案?
【问题讨论】:
标签: grammar context-free-grammar exponential automaton context-free-language
我有点被自动机和语法问题困扰。我搜索了很多,但没有任何成功。
是否有可能构造一个生成这种语言 L 的语法?
L = { a<sup>(2<sup>i</sup>)</sup> | i >= 0}
谁能给我一个简单的解决方案?
【问题讨论】:
标签: grammar context-free-grammar exponential automaton context-free-language
当然可以为这种语言编写一个语法,但它不会是一个上下文无关的语法。使用pumping lemma 很容易演示。
抽水引理指出,对于任何 CFL,都有一些整数 p 使得长度至少为 p 的语言中的任何字符串 s 都可以写成 uvxyz,其中 u, v、x、y 和 z 是字符串,vy 不为空,对于所有整数 n,字符串 uv<sup>n</sup>xy<sup>n</sup>z 也是该语言。
也就是说,对于语言中的任何字符串(其长度l 大于p),存在一些k 使得语言中存在长度为l + nk 的任何整数的字符串n。 a<sup>2<sup>i</sup></sup> 语言不是这种情况,因为这些字符串具有指数长度,因此该语言不能是上下文无关的。
为该语言构建一个非上下文无关的语法并不难,但我不知道它有多大用处。
以下是 0 类语法(即它也不是上下文相关的),但这只是因为用于摆脱元字符的产生式。这里的基本思想是我们在字符串周围放置开始和结束标记([ 和 ]),并且我们有一个“复制器”(↣ kbd>) 从左到右移动使 a 加倍;当它到达结束标记时,它要么变成一个返回穿梭(↢),要么它吃掉结束标记并变成一个开始标记销毁器(↞ kbd>)
<kbd>Start</kbd>: <kbd>[</kbd><kbd>&rarrtl;</kbd><kbd>a</kbd><kbd>]</kbd><kbd>&rarrtl;</kbd><kbd>a</kbd>: <kbd>a</kbd><kbd>a</kbd><kbd>&rarrtl;</kbd><kbd>&rarrtl;</kbd><kbd>]</kbd>: <kbd>&larrtl;</kbd><kbd>]</kbd><kbd>&rarrtl;</kbd><kbd>]</kbd>: <kbd>&Larr;</kbd><kbd>a</kbd><kbd>&larrtl;</kbd>: <kbd>&larrtl;</kbd><kbd>a</kbd><kbd>a</kbd><kbd>&Larr;</kbd>: <kbd>&Larr;</kbd><kbd>a</kbd><kbd>[</kbd><kbd>&larrtl;</kbd>: <kbd>[</kbd><kbd>&rarrtl;</kbd><kbd>[</kbd><kbd>&Larr;</kbd>:
【讨论】: