在Z3中给出一组约束(断言),我想知道检查我已经完成这些断言的模型的最有效方法是什么。该模型是从类似的约束集中获得的。我需要一个是/否答案,而不是Specifying initial model values for Z3中的软约束。
我使用x64版本的Z3 3.2操作位向量,在Windows 7 x64上使用C#API。我通过实例化多个Z3 Context
对象进行多线程处理,每个线程一个。由于缺乏对多线程的支持,我没有使用Z3 4.0。
我目前的方法是使用Context.AssertCnstr(Term)
将模型断言为一组额外的约束,然后简单地调用Context.Check()
。
答案 0 :(得分:1)
Z3公开了一个名为“Z3_model_eval”或“Model.Eval”的方法(来自C#) 需要一个模型和一个表达式。如果是,评估可能会失败 表达式包含量词,评估者无法确定 量化公式的真值以模型为模。 如果模型评估成功,您可以检查返回的值以确定 该模型是否强制断言为真。 Z3_model_eval的文档更详细地详述了合同:
http://research.microsoft.com/en-us/um/redmond/projects/z3/group__capi.html#ga86670c291a16640b932e7892176a9d1b
模型评估不会检测重言式,因此将模型序列化为 公式和Z3检查模型和断言之间的含义 可能更适合某些用途。