TL;DR: を使用すると、ビット ベクトル除算ノードが からにZ3_OP_BSDIV
変わります。除算操作と未解釈の操作をどのように区別できますか?Z3_OP_UNINTERPRETED
simplify
説明:
次のセッションは、ビット ベクトル除算が解釈されることを示していますが、 を使用した後は解釈されませんsimplify()
。以下の変数で何が起こるかを見てくださいd
。
>>> x, y = BitVecs('x y', 32)
>>> n = x/y
>>> n.decl().kind()
1031L
>>> d = simplify(x/y)
>>> d.decl().kind()
2051L
UDiv
手動で宣言された未解釈の関数があり、同じ種類もあることがわかります。
>>> foo = Function('foo', BitVecSort(32), BitVecSort(32), BitVecSort(32))
>>> u = foo(x, y)
>>> u.decl().kind()
2051L
>>> d1 = simplify(UDiv(x,y))
>>> d1.decl().kind()
2051L
ただし、解法には影響していないようです。ソルバーは依然として演算を実際の除算として解釈しているようです。
>>> prove(d != 400)
counterexample
[y = 1, x = 400]
ノードを種類ごとに処理しようとしていますが、これはその種類について「嘘をついている」ようです。実際に解釈されていることを知る方法はありkind
ますZ3_OP_UNINTERPRETED
か? これはバグですか?