z3 中未解释的 int 常量

Uninterpreted int Constants in z3

是否可以在 z3 中将 int 常量视为未解释?例如,将 tuple(project(t, 0), project(t, 1)) = t 视为 tuple(project(t, left), project(t, right)) = t。上下文:我的方程基本上在 QF_UF 中,但因为它们包含 int 常量,所以我不得不使用带有整数运算的逻辑,这有时会导致不终止。

您可以将 Int 声明为未解释的排序,只要您将逻辑设置为尚未定义的逻辑即可:

(set-logic QF_UF)

(declare-sort Int 0)
(declare-fun f ((Int)) Int)

(declare-fun i () Int)
(assert (distinct (f i) (f i)))
(check-sat)

z3 说:

unsat

如果您添加:

(assert (= (f 2) 2))

然后你得到:

(error "line 8 column 15: Sort mismatch at argument #1 for function (declare-fun f (Int) Int) supplied sort is Int")

这样可以避免混淆。 (尽管错误消息读起来相当混乱!)

如果您将逻辑设置为:

(set-logic QF_LIA)

然后 z3 说:

(error "line 3 column 18: sort already defined Int")

所以,这也行。有关详细信息,请参阅 SMTLib specification 的第 4.2.3 节。

希望对您有所帮助!