正则语言的有限性
Posted
技术标签:
【中文标题】正则语言的有限性【英文标题】:Finiteness of Regular Language 【发布时间】:2014-01-15 05:37:47 【问题描述】:我们都知道(a + b)*
是只包含符号a
和b
的常规语言。
但是(a + b)*
是一个无限长的字符串,它是有规律的,因为我们可以构建一个有限自动机,所以它应该是有限的。
谁能解释一下?
【问题讨论】:
【参考方案1】:(a+b)
语言中的每个单词都是有限长度的。就像有无限多个整数一样,但每个整数都是有限的。
是的,语言本身就是一个无限集合。大多数语言都是。但是有限自动机(注意:自动机是复数)对他们来说工作得很好,前提是每个单词的长度都是有限的。
顺便说一句:这类问题可能应该去 cs.stackexchange.com。
【讨论】:
【参考方案2】:1. 正则表达式描述了由某种语言生成的字符串。应用该正则表达式可为您提供该语言可以描述的所有字符串。
2. 当您将该正则表达式转换为有限自动机(具有有限状态的自动机)时,这意味着也可以通过从状态遍历来生成相同的字符串- 对该自动机进行陈述。现在,直观地说,这里的每个状态都代表属于该语言的字符串组。它说,在“吸收”了一些输入之后,字符串现在处于状态 X。
示例:
如果您希望正则表达式接受偶数 0 的字符串,那么您将拥有一个状态(组),表明偶数 0 已经到目前为止在输入中观察到。奇数的另一个状态(组) --> 这个状态将是您在 FA 中的不接受状态。
如此处所示,您只需要 2 个(有限)状态即可生成无限数量的字符串,因为我们对奇数和偶数进行了分组。
而这就是为什么它是常规的。
【讨论】:
【参考方案3】:可以为任何正则语言构造有限自动机,而正则语言可以是有限集或无限集。当然,有无限的集合是非常规集合。查看下面的维恩图:
备注: 1. 每个有限集都是正则集。 2. 无限集的任何 dfa 将始终包含循环(或者无限集不可能没有循环的 dfa)。 3.每一种非常规语言都是一个无限集。
有限自动机中的“有限”一词意味着在自动机中对于常规语言类存在“有限量的内存”,因此只有“有限”(或说有界)量的信息可以存储在任何实例处理一串语言的时间。
在有限自动机中,内存仅以状态的形式存在(而在另一类自动机如 Pda 中,图灵机的外部内存用于存储无限信息)。您可以将有限自动机视为没有显式内存的 CPU;只能将最近结果存储在其寄存器中。
因此,我们可以将“常规语言”定义为 — 一类语言,在处理语言字符串时,在任何时间实例中只需要存储有界(有限)信息。
进一步阅读(无限语言):
什么是正则语言:What is basically a regular language? And Whya*b*
is regular? But language a<sup>n</sup>b<sup>n</sup> | n > 0
is not a regular language
要了解状态如何用作内存元素,请阅读以下答案:How to write regular expression for a DFA
与自动有限和无限正则语言的区别:To make sure: Pumping lemma for infinite regular languages only?
【讨论】:
【参考方案4】:但是
(a + b)*
是一个无限长的字符串
不,(a + b)*
是一种有限方式来表达有限字符串的无限集合(语言)。
【讨论】:
你是对的!不仅正则表达式,Automate 和 Grammar 也是集合(语言)+ 的有限表示。【参考方案5】:这只是意味着存在指定语言的有限正则表达式,并且与从表达式生成的字符串无关。 对于许多正则语言,我们可以生成无限数量的字符串,这些字符串遵循该语言,但该语言是正则的,以证明我们需要一个必须是有限的正则表达式。 因此,这里的表达式 (a+b)* 是表达 0-n 个 a 或 b 或它们的组合的有限方式,但 n 可以采用任何值,从而导致无穷大。字符串。
【讨论】:
以上是关于正则语言的有限性的主要内容,如果未能解决你的问题,请参考以下文章