问题
我正在尝试使用z3来证明Petri网络上的可达性断言。
所以我声明了N个状态变量v0,.. v_n-1,它们是正整数,对于Petri网的每个位置来说都是一个。
给出关于状态的原子命题P的主要策略如下:
我将步骤分开是因为因为我要使用UNSAT,所以任何返回UNSAT的check_sat都会停止该过程,特别是最后一步的成本非常高。
我在大型模型上遇到问题,我得到的答案时间过长,甚至是可怕的“未知”答案,特别是在添加状态方程式时(步骤3)。
背景
因此,除了将问题分成越来越难的部分之外,我还尝试将逻辑设置为QF_LRA而不是QF_LIA,并将变量声明为Real而不是整数。
这种过度逼近在计算上是友好的(z3在这些上速度很快!),但是不幸的是,对于许多模型,解决方案不是整数,也不是整数解决方案。
因此,我尝试设置Reals,但指定每个变量为= 0或> = 1,以删除分数小于1的解。这确实消除了虚假解,但会“杀死” z3(超时或未知),在很多情况下,问题显然要困难得多(例如,比仅整数困难)。
示例
尽管我可以很容易地提出一些例子,但我没有一个小例子可以展示。问题是,如果我选择QF_LIA,它在某些变量上会变得非常慢。作为度量,过渡要比地方多得多,因此添加状态方程实际上会增加变量计数。
This code正在生成我要询问的示例。
如果您需要更多的数学背景,这张general presentation幻灯片5和6表示了我正在精确编码的问题,幻灯片7和8阐述了“ unsat”给我们的结果。
我从Model Checking Contest产生问题,多达数千个位置(主变量),在某些情况下超过十万个转换。这些是极值,中间范围是几千个位置,也许我真的要处理2万个过渡。
即使对于一些较小的问题,Reals +大于1的约束也不是一个好的解决方案。整数从一开始就很慢。
如果我得到一个非整数的解决方案,我可以尝试使用Reals然后迭代到Integers中,我没有尝试过,尽管它涉及大量的终止和重新启动求解器的工作,但这对我的基准测试集可能是一个不错的方法。
我在寻找什么
我正在寻找Z3的一些设置,这些设置可以更好地帮助它解决我所遇到的问题,并提供一些见解。 对于可以解决这些问题的方法,我有一个先验的想法,传统上,这些问题已送给ILP解决者。因此,我希望触发某种单纯形,但是在某些情况下,也许有条件阻止z3使用“好的”解决方案策略。
我已经成为SMT / Z3的高级用户,但我从未使用过:options的精细设置来指导求解器。
您是否尝试过将基本上是ILP的问题反馈给SMT,并找到了有助于其部署正确解决方案的选项设置或特定编码?谢谢。