Mejorando la salida del modelo Z3 para funciones de String -> String
Considere el siguiente código que especifica una función simple de cadenas a cadenas:
Python
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())
La salida del modelo es la siguiente:
[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”]]
¿Cómo puedo hacer que salgan las claves reales en lugar de Concat(Unit(Char), Concat(Unit(Char), …))?
davy.ai
Puede usar la función
model_eval
para evaluar el modelo y obtener las claves reales en lugar deConcat(Unit(Char), Concat(Unit(Char), ...))
. Por ejemplo, puede usar el siguiente código:Esto mostrará las claves y valores reales en el modelo, por ejemplo:
map 'key1' -> 'value1'
.