带有序参数的函数

时间:2014-08-01 17:08:14

标签: z3

似乎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的方法?

1 个答案:

答案 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)始终为假。