给定以下条件构造 DFA

问题描述

在 {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)

这是状态机的图片(圆圈是初始状态,双八边形是接受状态)。

Diagram of the above state machine

状态机图是使用这个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)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...