通过查看语言,是否有任何猜测语言是否正常?
为了选择证明方法,我首先必须有一些假设。您是否知道在解决长问题时减少时间消耗所需的任何提示/模式?
例如,为了不花时间抽取引理,当语言是常规的并且我不想构建DFA /语法时。
例如:
1. L={w ε {a,b}*/no of a in (w) < no of b in (w)}
2. L={a^nb^m/n,m>=0}
如何通过查看上面的例子来判断哪些是常规的?
答案 0 :(得分:0)
一般来说,在查看某种语言时,对于该语言是否规则的一个好的经验法则是考虑一个可以读取字符串的程序并回答“这个字符串是否在语言中?”的问题。 / p>
要编写这样的程序,您是否需要在变量中存储一些任意值,或者程序的状态(即所有可能变量值的组合)是否仅限于某些有限的固定数量的可能性?如果一个只需要固定数量的变量只能拥有固定数量值的程序就可以识别该语言,那么你就拥有了常规语言。如果没有,那就没有。
使用这个,我可以看到第一种语言不规则,但第二种语言是。在第一种语言中,我需要记住我见过多少a
,以及b
多少a
。 (或者至少,我需要跟踪(b
s的#) - (a
s的#),并且如果字符串结束而该计数为负,则接受。与此同时,n
的数量没有限制,因此这个数量可能会大大增加。
在第二语言中,我不关心m
和b
是什么。因此,使用第二语言,我的程序只会跟踪“我至少看过一个a
吗?”确保我们在第一个b
之后没有任何1. L={w ∈ {a,b}*/no of a in (w) < no of b in (w), and no of a in (w) < 100}
个字符。 (所以,一个变量只有两个值 - 真或假)
因此,将语言1转换为常规语言的一种方法是将其更改为:
a
现在我不需要跟踪一旦我达到100就看到b
的数量(从那以后我自动知道字符串不在语言中),同样使用a
s的数量 - 一旦我达到100,我就可以停止计数,因为我知道除非a
s的数量本身太大,否则就足够了。
你应该注意的一个常见情况是当有人问你“{{1}}的数量是13的倍数”或“ w ∈{0时, 1} *和 w 是13“倍数的二进制表示。有了这些,你可能看起来需要跟踪整个数字来做出决定,但事实上你没有 - 在这两种情况下,你只需要保留一个可以从0到12计数的变量。所以看out for“multiple of”-type languages。 (相关的“是奇数”或“是偶数”或“是1比13的倍数”)
其他数学属性 - 例如, w ∈{0,1} *和 w 是完美正方形的二进制表示 - 将导致非正规语言。