Al utilizar matrices SMTLIB, noté una diferencia entre la comprensión de Z3 de la teoría y la mía. Estoy usando la teoría de matriz SMTLIB [0] que se puede encontrar en el sitio web oficial [1].rareza de la matriz de matrices SMTLIB en Z3
Creo que mi problema se ilustra mejor con un ejemplo simple.
(store (store (store ((as const (Array Int Int)) 0) 0 1) 1 2) 0 0)
(store (store ((as const (Array Int Int)) 0) 0 1) 1 2)
La primera matriz debe devolver 2 en el índice 1 y 0 para todos los demás índices, el segundo debe devolver 1 en el índice 0, 2 en el índice 1, y 0 para todos los demás índices. Llamando select
en el índice 0 parece confirmar esto:
(assert
(=
(select (store (store (store ((as const (Array Int Int)) 0) 0 1) 1 2) 0 0) 0)
0
)
)
(assert
(=
1
(select (store (store ((as const (Array Int Int)) 0) 0 1) 1 2) 0)
)
)
Z3 vuelve sat
para ambos.
(assert
(=
(select (store (store (store ((as const (Array Int Int)) 0) 0 1) 1 2) 0 0) 0)
(select (store (store ((as const (Array Int Int)) 0) 0 1) 1 2) 0)
)
)
Como era de esperar, Z3 (en caso de que importa, estoy usando la versión 3.2 de Linux en AMD64) responde unsat
en este caso. A continuación, vamos a comparar estas dos matrices:
(assert
(=
(store (store (store ((as const (Array Int Int)) 0) 0 1) 1 2) 0 0)
(store (store ((as const (Array Int Int)) 0) 0 1) 1 2)
)
)
Z3 me dice sat
, que interpreto como "estas dos matrices comparan iguales". Sin embargo, esperaría que estas matrices no se compararan por igual. Me baso en la teoría de arreglos SMTLIB, que dice:
- (forall ((a (Array s1 s2)) (b (Array s1 s2)))
(=> (forall ((i s1)) (= (select a i) (select b i)))
(= a b)))
Así, en la llanura Inglés, esto significaría algo así como "Dos matrices deberá comparar iguales si, y sólo si son iguales para todos los índices". ¿Alguien puede explicarme esto? ¿Me estoy perdiendo algo o estoy malinterpretando la teoría? Estaría agradecido por cualquier idea que pueda tener sobre este tema.
Saludos, León
[0] http://goedel.cs.uiowa.edu/smtlib/theories/ArraysEx.smt2 [1] http://smtlib.org
Gracias por la respuesta rápida y la corrección de errores. De hecho, estoy aliviado de no tener que volver a escribir ninguno de mis códigos de generación SMTLIB debido a un malentendido :) Aparte de este pequeño error, mi experiencia con Z3 ha sido muy positiva hasta ahora. Me gustaría agradecerle (y a todos los demás en Microsoft Research) por crear Z3 y hacerlo accesible para todos. – leonh