问题描述
在 {0,1}* 上构造 DFA,其中转换为二进制的字符串必须能被 2 或 3 整除。此外,字符串中 1 的个数不能被整除
解决方法
让状态为 (a,b),其中 a 在 {0,1,2,3,4,5} 中,b 为 0 或 1。a 将记录输入数 mod 6,b 为奇偶校验输入中的 1s。起始状态是 (0,0),接受状态是 (0,1),(2,(3,(4,1)——也就是说,它可以被 2 或 3 整除(即:它是 0、2、3 或 4 mod 6),并且有奇数个 1。
然后过渡是:
- (a,b) -0-> (2a mod 6,b)
- (a,b) -1-> (2a+1 mod 6,1-b)
这是状态机的图片(圆圈是初始状态,双八边形是接受状态)。
状态机图是使用这个python程序以点格式生成的:
def state(a,b):
return 'q%d%d' % (a,b)
print('digraph g {')
print(' node [shape=plaintext];')
print(' %s [shape=circle]' % state(0,0))
for i in (0,4):
print(' %s [shape=doubleoctagon]' % state(i,1))
for a in range(6):
for b in range(2):
for x in range(2):
s0 = state(a,b)
s1 = state((2*a+x) % 6,(b+x) % 2)
print(' %s -> %s [label=%s]' % (s0,s1,str(x)))
print('}')
然后通过 dot 命令运行输出。在 linux 上可以是这样的:python fsm.py > g.dot && dot g.dot -Tpng -o g.png
(假设上面的代码保存为 fsm.py)。