![](/img/trans.png)
[英]How would I change this regular expression to accept a single decimal of .5 at the end?
[英]how would I build a generalized DFA for decimal Multiples of k?
假设我有这样的语言:L_k:={w∈Σ∗: (w)10=i·k, i∈N}。 现在使用 k 作为参数
我现在想定义一个接受 L_{k}- 的 DFA,然后证明这个 DFA 是有效的。 重要提示:k 是一个参数,因此条件和转换 function 取决于 k。
我将不胜感激任何帮助!
一个简单的解决方案是在每个 state 中存储除以 k 后的当前余数和下一个余数;
下一个余数是在你读到 0 之后的余数。
因此,您将使用状态S={(i,j): 0≤i,j<k\}
,其中 (0,0) 是初始 state。
读取数字 q 后,您将从(i,j)
移动到(j+q mod k, 10(j+q) mod k)
。
每个 state (0,j)
都是最终的,因为那里的当前余数为 0。
为了证明这是正确的,让x
表示一些十进制数,下一个余数为j
。 所以x0
数j
。 如果我们读取一个非 0 的数字,比如q
,那么我们将得到xq
,它有余数j+q mod k
(紧跟模算术,如 xq-x0 = q),下一个余数是xq0 = xq * 10
的余数xq0 = xq * 10
,所以很简单(j+q)*10 mod k
。
所以 i 确实是当前的余数,而 j 是下一个余数。
我读这篇文章的方式是你想要一个接受语言 0、4、8、12、16、...、4n、...,对于 k = 4 或 7、14、21、28 的 DFA。 .., 7n, ... 对于 k = 7。
要实现这一点,您的 DFA 将始终从初始 state 开始,对应于除以 0 的 k 后的余数。此 state 始终接受,因为 0 是 Z157DB7DF530023575515D366C9B67 的任意倍数
现在,当我们读到一个数字时,我们正在做的是更新我们对迄今为止所读到的数字的理解:到目前为止,我们所理解的数字实际上比我们想象的要大十倍,加上这个数字。 假设我们在 state 中,对应于除以 k 后的余数等于 m,我们读取的下一个数字是 d。 然后:
m' = (10 * m + d) % k
我们可以通过对我们目前已经理解的除法后的余数进行转换来获得新理解的数字除以 k 后的余数。 因为要让这个结构起作用,我们只需要跟踪除以 k 后的余数(我们通过读取输入免费得到 d,并且可以立即忘记它),我们只需要恰好 k 个状态在我们的 DFA 中。
这如何寻找 k = 7?
m = 0, d = 0: m' = 0; transition from q0 to q0 on symbol 0
d = 1: m' = 1; transition from q0 to q1 on symbol 1
d = 2: m' = 2; transition from q0 to q2 on symbol 2
d = 3: m' = 3; transition from q0 to q3 on symbol 3
d = 4: m' = 4; transition from q0 to q4 on symbol 4
d = 5: m' = 5; transition from q0 to q5 on symbol 5
d = 6: m' = 6; transition from q0 to q6 on symbol 6
d = 7: m' = 0; transition from q0 to q0 on symbol 7
d = 8: m' = 1; transition from q0 to q1 on symbol 8
d = 9: m' = 2; transition from q0 to q2 on symbol 9
...
m = 6, d = 0: m' = 4; transition from q6 to q4 on symbol 0
d = 1: m' = 5; transition from q6 to q5 on symbol 1
d = 2: m' = 6; transition from q6 to q6 on symbol 2
d = 3: m' = 0; transition from q6 to q0 on symbol 3
d = 4: m' = 1; transition from q6 to q1 on symbol 4
d = 5: m' = 2; transition from q6 to q2 on symbol 5
d = 6: m' = 3; transition from q6 to q3 on symbol 6
d = 7: m' = 4; transition from q6 to q4 on symbol 7
d = 8: m' = 5; transition from q6 to q5 on symbol 8
d = 9: m' = 6; transition from q6 to q6 on symbol 9
我们得到一个具有 7 个状态和 70 个转换的 DFA。 一般来说,这种方法总是会给出一个具有 k 个状态和 10k 个转换的 DFA。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.