【发布时间】:2015-12-17 18:08:33
【问题描述】:
我正在尝试证明这种语言是否:
L = { w={0,1}* | #0(w) % 3 = 0 }(0的个数可以被3整除)
经常使用抽水引理,但我找不到办法。我得到的所有其他示例,有一个简单的形式,或者说一个更定义的形式,例如 w = axbycz 等。
【问题讨论】:
标签: finite-automata automata computation-theory dfa formal-languages
我正在尝试证明这种语言是否:
L = { w={0,1}* | #0(w) % 3 = 0 }(0的个数可以被3整除)
经常使用抽水引理,但我找不到办法。我得到的所有其他示例,有一个简单的形式,或者说一个更定义的形式,例如 w = axbycz 等。
【问题讨论】:
标签: finite-automata automata computation-theory dfa formal-languages
该语言中至少包含三个字符的任何字符串都具有此属性:字符串中包含“1”,或者连续三个“0”。
如果字符串包含1,那么您可以将其拆分为抽水引理,并设置y 等于字符串中的某个1。那么显然字符串 xyz、xyyz、xyyyz 等都在语言中,因为所有这些字符串都有相同数量的零。
如果字符串不包含1,则连续包含三个0s。设置y为那三个0s,应该很明显xyz、xyyz、xyyyz等. 都在语言中,因为您每次要添加三个 0 字符,因此您总是有许多 0s 可以被 3 整除。
cmets 中的@justhalf 是完全正确的; pumping lemma 可以用来证明一种正则语言可以被pump,或者不能被pump 的语言不是正则的,但是你不能用pumping lemma 来证明一种语言是正则的。过错。
相反,这里证明了给定语言是基于Myhill-Nerode Theorem 的常规语言:
考虑0s 和1s 的所有字符串的集合。将这些字符串分成三组:
E0,所有字符串使得
0s 的个数是三的倍数,E1,所有字符串,使得
0s 的数量是三的倍数多一,E2,所有字符串,使得
0s 的数量是三的倍数多二。
显然,0s 和 1s 的每个字符串都属于这三个集合之一。
此外,如果 x 和 z 都是 0s 和 1s 的字符串,那么考虑如果串联 xz 在 L:
如果 x 在 E0 中,则 xz 在 L 当且仅当 z 在 E0
如果 x 在 E1 中,则 xz 在 L 当且仅当 z 在 E2
如果 x 在 E2 中,则 xz 在 L 当且仅当 z 在 E1
因此,在定理的语言中,我们三个 Ei 集合中的同一集合中的任何两个字符串都没有可区分的扩展,因此有最多三个等价类。有限数量的等价类意味着语言是规则的。
(实际上,正好有三个等价类,但这不是必须的)
【讨论】:
我们必须构建一个重新控制 L 的自动机。
对于每个状态,思考如下:
所以,对于 L = { w={0,1}* | #0(w) % 3 = 0 }
可能性(状态)是:
余数(除法的余数)是 0、1 或 2。这意味着我们需要三个状态。
令 q0、q1 和 q2 分别为表示余数 0,1 和 2 的状态。
q0 是开始和最终状态。
现在,对于“0”条目,执行数学 #0(w)%3 并进入适当的状态。
转换功能:
f(q0, 0) = q1
f(q1, 0) = q2
f(q2, 0) = q0
对于“1”条目,它只是在任何地方循环,因为它不会改变机器状态。
f(qx, 1) = qx
抽水引理证明某种语言是否不规则。
这是一本关于计算理论的好书:计算理论导论第 3 版
作者:Michael Sipser。
【讨论】:
我认为您不能使用抽引引理来证明一种语言是正则的。要证明一种语言是正则的,你只需要给出一个正则表达式或一个 DFA。在这种情况下,正则表达式非常简单:
1*(01*01*01*)*(证明:正则表达式显然不接受任何0个数不能被3整除的字符串,所以我们只需要证明所有可能的0个数能被3整除的字符串都被这个正则接受表达式,可以通过确认对于包含 3n 个 0 的字符串,正则表达式匹配它,因为 1n001n1 sub>01n201n3...01n3n-201n3n-101n3n 有可以替换相同数量的 0 和 nk,使其与字符串匹配,并且正则表达式清楚地接受这种格式)
抽引引理不能用来证明一种语言是正则的,因为我们不能像丹尼尔马丁的回答那样设置y。这是一个反例,格式与他的答案相似(如果我做的事情与他的答案完全不同,请纠正我):
我们证明语言 L = {w=0n1p | n ∈ N, n>0, p is prime} 是正则的使用抽引引理如下:注意至少有一次出现 0,所以我们取 y 为 0,我们有 xyk z = 0n+k-11p,仍然满足语言定义。所以 L 是正则的。
但这是错误的,因为我们知道具有素数长度的序列是不规则的。这里的问题是我们不能只将 y 设置为任何字符。
【讨论】:
1s 的非空字符串。我想你的意思是1*(01*01*01*)*。当然,你还需要证明正则表达式匹配语言语句。