改进 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,那么我会看到你看到的输出;这显然是假的。

请在 https://github.com/Z3Prover/z3/issues

将此作为错误报告