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

提高使用Z3Py进行被动学习时的可扩展性,z3,theory,z3py,Z3,Theory,Z3py,我的团队一直在使用Z3解算器进行被动学习。被动学习需要从一组观察结果中获得一个与该组中所有观察结果一致的模型。我们考虑不同形式的模型,最简单的是确定性有限自动机(DFA)和Mealy机器。对于DFA而言,观测值只是正样本或负样本 这种方法非常简单。给定形式主义和观察,我们将每个观察编码为(未解释的)函数上的Z3约束,该约束对应于形式主义定义中的函数。例如,对于DFAs,此定义包括一个转换函数(trans:States X Inputs->States)和一个输出函数(out:States->Bo

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

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

假设观察结果(aa,+)如下所示:

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

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

我发布了一个网站,它就是这样做的。可以预见,我们的方法是不可伸缩的(问题是NP完全的)。我想知道是否有任何(小)调整,我们可以执行,以提高可伸缩性?(以尝试不同种类、策略的方式……)

我们已经尝试将所有观察结果安排到一个前缀树中,并在编码中使用该树,但可伸缩性只得到了微小的改进。我很清楚,有更多可伸缩的基于SAT的方法来解决这个问题(将其简化为图形着色问题)。我们想看看一个简单的基于SMT的方法能带我们走多远

到目前为止,我发现定义输入和状态的最佳分类是DeclareSort。如果我们从状态大小约束中消除量词,它也会有所帮助。有趣的是,增量求解并没有真正起到帮助作用。但这可能是因为我没有正确地使用它(我是SMT理论的新手)

谢谢!顺便说一句,我不确定这个测试作为SMT解决方案的基准有多可行/有用