使用Z3Py进行被动学习时提高可扩展性

时间:2017-10-18 08:47:11

标签: z3 theory z3py

我的团队一直在使用Z3解算器执行被动学习。被动学习需要从一组观察中获得与该组中的所有观察一致的模型。我们考虑不同形式的模型,最简单的是确定性有限自动机(DFA)和Mealy机器。对于DFA,观察只是正样本或负样本。

这种方法非常简单。给定形式和观察,我们将每个观察编码为(未解释的)函数的Z3约束,这些函数对应于形式主义定义中的函数。例如,对于DFA,此定义包括转换函数( trans:States X Inputs - > States )和输出函数( out:States - > Boolean )。

编码说观察(aa,+)将按如下方式完成:

out(trans(trans(start,a),a))== True

start 的初始状态。为了构造模型,我们将所有观察约束添加到求解器中。我们还添加了一个限制模型中状态数量的约束。我们解决了限制为1,2,3 ...状态的约束,直到求解器找到解。解决方案是一个与观察结果一致的最小状态模型。

我发布了一个code snippet using Z3Py就是这样做的。可以预见,我们的方法不可扩展(问题是NP完全)。我想知道是否有任何(小)调整我们可以执行以提高可扩展性? (尝试不同的方式,策略......)

我们已经尝试将所有观察结果安排到前缀树中并在编码中使用此树,但可扩展性仅略有提高。我很清楚,这个问题有更多可扩展的基于SAT的方法(将其减少为图形着色问题)。我们希望看到一个简单的基于SMT的方法可以带我们走多远。

到目前为止,我发现用于定义输入和状态的最佳排序是 DeclareSort 。如果我们从状态大小约束中消除量词,它也会有所帮助。有趣的是,渐进式求解并没有真正帮助。但可能是我没有正确使用它(我是SMT理论中的一个新手)。

谢谢!顺便说一句,我不确定这个测试作为SMT求解器的基准是多么可行/有用。

0 个答案:

没有答案