4 个状态就足够了。您需要同时满足两个条件:偶数个 a 和奇数个 b。彼此无关,每个条件都可以是真或假。
如果我们用 1 表示 true 和用 0 表示 false,我们会得到 4 个不同的 可能性:两者都是 false,其中之一 (但不是另一个)是真的,或者他们两个都是真的。因此,我们得到了一个真值表:
even a | odd b
---------------
0 0
0 1
1 0
1 1
让我们用q[0, 0] 表示第一行,第二行用q[0, 1] 表示,以此类推。现在我们必须为每个状态指定转换,并确定我们的初始状态。
无论我们处于何种状态,都有两种可能的输入:a 或 b。因此,对于每个状态,我们必须指定两个转换。
现在,我们的初始状态是我们在使用任何输入之前所处的状态。由于 0 是偶数,我们得到我们的初始状态是q[1, 0]。我们的接受状态是两个条件都满足时,即q[1, 1]。
最后,我们有了状态转换,
q[0, 1] 是我们的初始状态
q[1, 0] reads b -> q[1, 1]
q[1, 0] reads a -> q[0, 0]
q[1, 1]是我们的接受状态
q[1, 1] reads b -> q[1, 0]
q[1, 1] reads a -> q[0, 1]
q[0, 1] 只有当我们阅读至少一个a
时,才会达到此状态
q[0, 1] reads b -> q[0, 0]
q[0, 1] reads a -> q[1, 1]
q[0, 0] 这个状态只有在我们读过至少一个a
时才会达到
q[0, 0] reads b -> q[0, 1]
q[0, 0] reads a -> q[1, 0]