从Z3py转储的smt2代码为here。如果向下滚动到底部,您会看到有一个假设,如果注释掉,会立即解决问题。
我有几个问题:
我已经解决了类似的情况并且它们非常快。
当我从Z3py用verbose = 10解决这个问题时,我在解决时会看到这样的输出:
(smt.restarting :propagations 35577 :decisions 13935 :conflicts 277 :restart 110 :restart-outer 110 :agility 0.0356467)
(smt.restarting :propagations 40109 :decisions 15040 :conflicts 388 :restart 100 :restart-outer 121 :agility 0.0452989)
(smt.restarting :propagations 43945 :decisions 15901 :conflicts 489 :restart 110 :restart-outer 121 :agility 0.0671191)
不确定这是否有帮助。感谢。
答案 0 :(得分:2)
输入中的微小变化通常会对Z3运行时产生巨大影响,特别是如果它们是析取的(就像你的假设一样)。似乎在这个问题上,SMT核心求解器只是难以搜索解决方案,在尝试了数千个分支( m(5)
/ \
m(5-1) + m(5-3)
/ \ |
m(4-1) + m(4-3) |
/ \ | |
m(3-1) + m(3-3) | |
| | | |
1 + 0 + 0 + 1
2
)后,它决定放弃并从头开始(:decisions 13935
)。
理论选择很好。如果您不需要UF,可以将其设置为QF_ABV,但默认情况下Z3将使用相同的策略/参数。
我不确定我看到哪里有“调试”的错误,但我想“调试”你的意思是“让它变得更快”?