问题描述
我正在努力理解描述 3 个字母语言的正则表达式的概念,其中唯一的限制是所有三个字符都以一个特定的顺序出现。
例如1: 在 \S = {a,b,c} 上写一个正则表达式,以确保 w 使得没有出现字符串“abc”
有效匹配包括 {bac,baac,cad,aaaaccb,abababac} 唯一不应该产生的词是“abc”
eg2: 在 \S = {x,y,z} 上写一个正则表达式,确保 w 使得没有出现字符串“zyx”
有效匹配包括 {xyz,xyyx,yzx,zzyyxc,xyxyxzyzy} 唯一不应该产生的词是“zyx”
解决方法
我们可以先做一个DFA,然后运行算法来生成正则表达式。
第一个 DFA 是:
q s q'
----------------
q0 b,c q0
q0 a q1
q1 a q1
q1 b q2
q1 c q0
q2 a q1
q2 b q0
q2 c q3
q3 a,b,c q3
我们可以写一些方程式...
q0 = q0(b + c) + q1c + q2b
q1 = q0a + q1a + q2a
q2 = q1b
我们可以用 q1b 替换 q2 的所有实例 ...
q0 = q0(b + c) + q1(c + bb)
q1 = q0a + q1(a + ba)
q2 = q1b
我们可以去掉 q1 方程中的递归:
q0 = q0(b + c) + q1(c + bb) + e
q1 = q0a(a + ba)*
q2 = q1b
现在替换 q1 的表达式...
q0 = q0((b + c) + a(a + ba)*(c + bb)) + e
q1 = q0a(a + ba)*
q2 = q1b
从 q0 的方程中去除递归得到:
q0 = ((b + c) + a(a + ba)*(c + bb))*
q1 = q0a(a + ba)*
q2 = q1b
填写其他给
q0 = ((b + c) + a(a + ba)*(c + bb))*
q1 = ((b + c) + a(a + ba)*(c + bb))*a(a + ba)*
q2 = ((b + c) + a(a + ba)*(c + bb))*a(a + ba)*b
既然这三个州都在接受,我们的 RE 应该是联合:
r = ((b + c) + a(a + ba)*(c + bb))*(e + a(a + ba)*(e + b))
你的另一个例子非常相似。