如果在实践中必须这样做,则可以使用SAT解算器。
是否存在与DFA问题接受状态X和拒绝ÿ可以容易地表示为SAT实例。例如,一种方法是有2个ķ 2布尔变量:Ž 小号,b ,吨是如果DFA转换从状态真小号到状态吨上输入位b。然后添加一些子句以强制将其视为DFA,并添加一些变量和子句以强制其接受x并拒绝y。kxy2k2zs,b,tstbxy
现在,对使用二进制搜索以找到最小的k,以使此类DFA存在。根据我在有关相关问题的论文中所读的内容,我希望这在实践中可能是相当有效的。kk
作为SAT的其他编码也是可能的。例如,我们可以使用跟踪编码:
如果是的长度米,可以添加米LG ķ布尔变量:设小号0,s ^ 1,... ,小号中号被遍历上输入状态的序列X,和表示每个š 我使用⌈ LG ķ ⌉布尔变量。xmmlgks0,s1,…,smxsi⌈lgk⌉
现在,对于每个使得x i = x j,约束为s i − 1 = s j − 1i,jxi=xj。si−1=sj−1⟹si=sj
接下来,将其扩展为处理:令t 0,… ,t n为在输入y上遍历的状态序列,并使用lg k布尔变量表示每个t j。对于每个i ,j使得y i = y j,添加约束t i − 1 = t j − 1yt0,…,tnytjlgki,jyi=yj。ti−1=tj−1⟹ti=tj
同样,对于每个使得x i = y j,添加约束s i − 1 = t j − 1i,jxi=yj。si−1=tj−1⟹si=tj
两条迹线必须从相同的起点开始,因此添加要求(WLOG您可以要求s 0 = t 0 = 0)。s0=t0s0=t0=0
为了确保DFA仅使用状态,要求0 ≤ 小号我 < ķ和0 ≤ 吨Ĵ < ķ所有我,Ĵ。k0≤si<k0≤tj<ki,j
最后,为了对被接受而y被拒绝的要求进行编码,要求s m ≠ t n。xysm≠tn
所有这些要求都可以编码为SAT子句。
与以前一样,您将对使用二进制搜索来找到存在DFA 的最小k。kk