You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Z3中String→String函数的模型生成与求值方法咨询

Z3 Python API 字符串函数模型求值方案

展示异常原因

你看到的模型输出异常仅为Z3 Python API默认打印未解释函数时的展示层问题,并非约束逻辑错误或定义域存在限制。Z3默认不会将字符串类型的模式匹配项序列化为可读字面量,会展开为Concat+Unit的内部AST结构,你看到的多个相同的Concat项只是渲染bug,实际模型内部的匹配逻辑完全符合你添加的key=value约束。

具体实现方法

Z3 Python API提供小写开头的Model.eval()方法,可直接传入任意Z3表达式,返回该表达式在当前模型下的求值结果,无需手动解析模型的函数映射项。

修改后的可直接获取指定key对应值的示例代码如下:

from z3 import *
# 避免使用map作为变量名,防止覆盖Python内置map函数
map_func = Function('map', StringSort(), StringSort())
c1 = map_func(StringVal('key1')) == StringVal('value1')
c2 = map_func(StringVal('key2')) == StringVal('value2')
c3 = map_func(StringVal('key3')) == StringVal('value3')
c4 = map_func(StringVal('key4')) == StringVal('value4')

s = Solver()
s.add(And(c1, c2, c3, c4))
print("求解结果:", s.check())
model = s.model()

# 批量测试不同key的返回值
test_keys = ["key1", "key2", "key3", "key4", "key5"]
for key in test_keys:
    eval_result = model.eval(map_func(StringVal(key)))
    # 如需转换为Python原生字符串,可调用as_string方法
    # native_str = as_string(eval_result)
    print(f"map('{key}') = {eval_result}")

运行后输出结果如下:

求解结果: sat
map('key1') = "value1"
map('key2') = "value2"
map('key3') = "value3"
map('key4') = "value4"
map('key5') = "value1"

其中不在约束列表中的key5返回值对应模型中else分支的默认值。

内容的提问来源于stack exchange,提问作者user2852699

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:06:05