似乎uninterpret函数将参数视为无序。 例如,
(declare-fun Lturn (Int Int Int) Bool)
(assert (forall ((x Int) (y Int) (z Int))
(not (= (Lturn x y z) (Lturn x z y)))))
(check-sat)
结果是UNSAT。 上面的代码可在此处找到:http://rise4fun.com/Z3/hkpwO
为了克服这种情况,我尝试使用数组:
(declare-fun Lturn ((Array Int Int)) Bool)
(assert (forall ((A1 (Array Int Int)) (A2 (Array Int Int)))
(=> (and (= (select A1 1) (select A2 1))
(= (select A1 2) (select A2 3))
(= (select A1 3) (select A2 2)))
(not (= (Lturn A1) (Lturn A2))))))
(check-sat)
结果是“未知”。 上面的代码可在此处找到:http://rise4fun.com/Z3/bdTL
有没有让Array版本成为SAT的方法?
答案 0 :(得分:3)
函数参数不是无序的。你能给出一个能让你断言SAT的函数Lturn
吗?这只是一个简单的例子,只有两个参数:http://rise4fun.com/Z3/Zsjs
对于x == 0 && y == 0 && z == 0
,没有f(x, y, z) != f(x, z, y)
的功能,因为f(0, 0, 0) != f(0, 0, 0)
始终为假。