簡體   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