描述三个字母语言的正则表达式,其中没有出现所有三个字符以特定顺序出现的单词

问题描述

我正在努力理解描述 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))

你的另一个例子非常相似。