改进 String -> String 函数的 Z3 模型输出
Improving Z3 model output for String -> String functions
考虑以下代码,指定一个从字符串到字符串的简单函数:
from z3 import *
map = Function('map', StringSort(), StringSort())
c1 = map(StringVal('key1')) == StringVal('value1')
c2 = map(StringVal('key2')) == StringVal('value2')
c3 = map(StringVal('key3')) == StringVal('value3')
c4 = map(StringVal('key4')) == StringVal('value4')
s = Solver()
s.add(And(c1, c2, c3, c4))
print(s.check())
print(s.model())
模型输出如下:
[map = [Concat(Unit(Char),
Concat(Unit(Char),
Concat(Unit(Char), Unit(Char)))) ->
"value1",
Concat(Unit(Char),
Concat(Unit(Char),
Concat(Unit(Char), Unit(Char)))) ->
"value2",
Concat(Unit(Char),
Concat(Unit(Char),
Concat(Unit(Char), Unit(Char)))) ->
"value3",
Concat(Unit(Char),
Concat(Unit(Char),
Concat(Unit(Char), Unit(Char)))) ->
"value4",
else -> "value1"]]
如何让它输出实际的密钥而不是 Concat(Unit(Char), Concat(Unit(Char), ...))
?
这似乎是 z3py 中最近的一个损坏。如果我 运行 你的程序是在 2021 年 8 月 3 日从他们的 GitHub master 编译的 z3,我得到:
sat
[map = ["key2" -> "value2",
"key3" -> "value3",
"key4" -> "value4",
else -> "value1"]]
但是如果我 运行 使用 2021 年 11 月 15 日编译的 z3,那么我会看到你看到的输出;这显然是假的。
将此作为错误报告
考虑以下代码,指定一个从字符串到字符串的简单函数:
from z3 import *
map = Function('map', StringSort(), StringSort())
c1 = map(StringVal('key1')) == StringVal('value1')
c2 = map(StringVal('key2')) == StringVal('value2')
c3 = map(StringVal('key3')) == StringVal('value3')
c4 = map(StringVal('key4')) == StringVal('value4')
s = Solver()
s.add(And(c1, c2, c3, c4))
print(s.check())
print(s.model())
模型输出如下:
[map = [Concat(Unit(Char),
Concat(Unit(Char),
Concat(Unit(Char), Unit(Char)))) ->
"value1",
Concat(Unit(Char),
Concat(Unit(Char),
Concat(Unit(Char), Unit(Char)))) ->
"value2",
Concat(Unit(Char),
Concat(Unit(Char),
Concat(Unit(Char), Unit(Char)))) ->
"value3",
Concat(Unit(Char),
Concat(Unit(Char),
Concat(Unit(Char), Unit(Char)))) ->
"value4",
else -> "value1"]]
如何让它输出实际的密钥而不是 Concat(Unit(Char), Concat(Unit(Char), ...))
?
这似乎是 z3py 中最近的一个损坏。如果我 运行 你的程序是在 2021 年 8 月 3 日从他们的 GitHub master 编译的 z3,我得到:
sat
[map = ["key2" -> "value2",
"key3" -> "value3",
"key4" -> "value4",
else -> "value1"]]
但是如果我 运行 使用 2021 年 11 月 15 日编译的 z3,那么我会看到你看到的输出;这显然是假的。
将此作为错误报告