我正在尝试使用Z3,由Microsoft Research开发的SMT求解器,检索某些一阶理论的所有可能模型。以下是一个最小工作示例:
(declare-const f Bool)
(assert (or (= f true) (= f false)))
在这个命题案例中,有两种令人满意的赋值:f->true
和f->false
。因为Z3(以及一般的SMT求解器)只会尝试找到一个令人满意的模型,所以直接找到所有解决方案是不可能的。在这里,我找到了一个有用的命令叫做(next-sat)
,但是最新版本的 Z3似乎不再支持它。这对我来说有点不幸,而且我认为这个命令通常非常有用。还有其他方法可以做到这一点吗?
8942 801 1663 5 599 320 450 2 2 3 1 5 1377 36 5 738 162 105 1639 3 5 16 2041 27 475 953 562 746 45 151 18 4206 3416 9 850 120 3 4 12 615 593 1219 449 154 987 3 10 1365 16 438 792 1686 743 46 5 8 412 126
。请注意,第一个模型肯定最耗时,但其他模型的时间更随机(可能取决于问题和求解器的运气)。 - Stanley Bak