指定Z3的初始模型值
如何为模型指定初始“软”值?这个初始模型是解决一个类似查询的结果,对于当前查询,这个模型可能有正确的片段,甚至可能是正确的 目前,我正在通过增量求解模拟此问题,并且: 这是否真的将指定Z3的初始模型值,z3,Z3,如何为模型指定初始“软”值?这个初始模型是解决一个类似查询的结果,对于当前查询,这个模型可能有正确的片段,甚至可能是正确的 目前,我正在通过增量求解模拟此问题,并且: 这是否真的将trans\u sequed的初始值指定为trans\u sequed 增量求解模式比顺序求解模式慢。引入初始值的更好方法是什么? < P>我认为这是一个很好的方法,但是你可以考虑使用更多的布尔变量。现在,这是一种“全部”或“没有”的方法。在您的脚本中,当执行(check sat p)时,Z3将查找一个模型,其中tra
trans\u sequed
的初始值指定为trans\u sequed
增量求解模式比顺序求解模式慢。引入初始值的更好方法是什么? < P>我认为这是一个很好的方法,但是你可以考虑使用更多的布尔变量。现在,这是一种“全部”或“没有”的方法。在您的脚本中,当执行
(check sat p)
时,Z3将查找一个模型,其中trans\u假定的和trans\u寻求的具有相同的解释。如果该模型不存在,它将返回包含p
的unsat核心。当执行(check)
时,Z3可以自由地将p
赋值给false
,并且通用量词本质上是一个不在乎的量词。也就是说,trans\u假定的
和trans\u寻求的
可以完全不同
如果您使用多个布尔变量来控制trans_
的解释,您将拥有更大的灵活性。
如果问题的其余部分是无量词的,则应该考虑删除通用量词。如果您只关心有限个点中的trans_seek
值,则可以执行此操作
假设我们有trans\u假设(0)=1
和trans\u假设(1)=10
。然后,我们可以写:
assert (=> p0 (= (trans_sought 0) 1)))
assert (=> p1 (= (trans_sought 1) 10)))
在这种编码中,我们可以查询(检查sat p0 p1)
,(检查sat p0)
,(检查sat p1)
哦,听起来很有趣!据我所知,你建议对相同的模型进行精细的假设。但这可能会导致许多具有不同假设的检查sat p..
调用。这可能很昂贵(嗯,值得怀疑,因为它是递增的)。我试图避免这种情况,让Z3启发法来选择模型的哪些部分应该保留。如果trans\u假定的
和trans\u寻求的
完全不同,则可以!我只想让Z3从trans_假设的开始,然后Z3可以使用自己的启发式方法对其进行调整。Z3将调整转换,还是从一个全新的转换开始?Z3将为(check sat)
创建一个新模型,但它将重新使用在第一个(check sat p)
中学习的引理。但是,如果Z3将p
赋值给false
,则依赖于p
的任何引理都将自动禁用。使用随机化也可能是一个问题。我认为您可能会以一个不稳定的解决方案结束(即,它并不总是有效)。
assert (=> p0 (= (trans_sought 0) 1)))
assert (=> p1 (= (trans_sought 1) 10)))