【问题标题】:Construct a DFA given the following conditions在给定以下条件的情况下构造 DFA
【发布时间】:2021-05-23 09:35:33
【问题描述】:

在 {0,1}* 上构造一个 DFA,其中字符串在转换为二进制时必须能被 2 或 3 整除。此外,字符串中 1 的数量不能被 1 整除

【问题讨论】:

    标签: dfa


    【解决方案1】:

    设状态为 (a, b),其中 a 在 {0,1,2,3,4,5} 中,b 为 0 或 1。a 将记录输入数 mod 6,b 为奇偶校验输入中的 1 秒。起始状态是 (0, 0),接受状态是 (0, 1), (2, 1), (3, 1), (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, 2, 3, 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)。

    【讨论】:

    • 状态机(我相信)是最小的。我添加了生成状态机图片的代码以及它在 linux 上使用此命令行输出的图片:python fsm.py > g.dot && dot g.dot -Tpng -o g.png
    • 我明白了这个方法,但我相信你正在解决错误的问题。这个问题想要被 2 OR 3 整除,而不是 2 AND 3。所以你应该只跟踪均匀性、被三(不是 6)整除和奇偶校验,即 12 个状态,不是吗?
    • @PSkocik 是的,你是对的 - 我看错了。该问题可以通过接受 (0, 1), (2, 1), (3, 1), (4, 1) 来解决,因为可被 2 或 3 整除意味着等于 0、2、3 或 4 mod 6 . 我随后修复了答案。
    • PSkocik 观察到的问题已经修复,所以我认为 DFA 是正确的。你是否相信它是正确的取决于你:)
    • @PaulHankin 你也可以看看这个问题吗? stackoverflow.com/questions/66301231/…
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2011-05-23
    相关资源
    最近更新 更多