繁体   English   中英

无法在 z3py 中提取 Z3 EnumSort 的值

[英]Unable to extract value for Z3 EnumSort in z3py

我目前正在尝试将问题编码到 Z3 中,并且我希望对“三态”布尔值建模(即,具有truefalseunknown的布尔值)。

这是我建模的方式:

#!/usr/bin/env python

import z3
from collections import OrderedDict

TristateValues = ["True", "False", "Unknown"]
Tristate, consts = z3.EnumSort("Tristate", TristateValues)
TristateValues = OrderedDict(zip(TristateValues, consts))

s = z3.Solver()
x = z3.Const("x", Tristate)
s.add(x != TristateValues["Unknown"])
value = s.check()
if value == z3.sat:
    m = s.model()
    print str(m.eval(x))
else:
    print str(value)

# EOF

在这个小例子中,一切运行良好,我得到了诸如TrueFalse值。

但是,在较大的示例中,我得到的结果如下:

  • Tristate!val!0
  • Tristate!val!1
  • Tristate!val!2

显然,这些“三态”字符串和真实值之间似乎存在映射,所以我写了这样的东西:

ModelToTristate = {}

as_list = list(TristateValues.keys())
for idx in range(0, len(as_list)):
    ModelToTristate["Tristate!val!{:d}".format(idx)] = as_list[idx]

尝试在值之间映射回(这就是为什么使用OrderedDict对保持排序很重要的原因)。

而且,最初,这似乎奏效了。 然而,我又遇到了一些更奇怪的错误:

  • 我最终会在ModelToTristate中找到查找错误,在那里我似乎确实获得了对model.eval()结果调用str的正确值(即,Z3 会给出TrueFalse等,而不是Tristate!val!* )
  • 我会在模型中出现不一致(例如,即使在断言x == Tristate["False"] ,检查查找也会导致model.eval(x) == Tristate!val!1 ,其中Tristate!val!1映射到True )

对于最后一个问题,我认为存在查找问题,而不是 Z3 给出的值不正确。

所以,我的问题是:是什么导致 Z3 使用这些Tristate!val!*字符串,我是否可以“强制”Z3 使用正确的值(即TrueFalseUnknown )?

我正在使用 Z3 4.5.0。

检查后更新,当我使用SolverFor("QF_ABV")时,似乎出现此问题。

QF_ABV 逻辑不知道代数数据类型。 它会将它们视为未解释的。 你得到的模型就像枚举排序是免费的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM