Z3应该证明<;=(关于乘法)?

Z3应该证明<;=(关于乘法)?,z3,Z3,这是一个更有趣问题的简化,其中缺少的属性是(对于正k、M和N),即((k%M)*N)b0)) (断言(>c0)) (assert(这属于非线性整数算法(它有一个不可判定的决策问题,请参见,例如),因此对于一些示例,Z3返回unknown实际上并不太令人惊讶,尽管对于非常类似的示例,它在unsat和unknown之间切换有点令人惊讶 如果它适用于您的应用程序,您可以尝试类型强制:将常量编码为Real而不是Int。这将允许您使用Z3的非线性实数算术完整解算器,并使用check sat返回unsat

这是一个更有趣问题的简化,其中缺少的属性是(对于正
k
M
N
),即
((k%M)*N)
。下面是对较简单问题的编码,即
a(a*c)a0))
(断言(>b0))
(断言(>c0))

(assert(这属于非线性整数算法(它有一个不可判定的决策问题,请参见,例如),因此对于一些示例,Z3返回unknown实际上并不太令人惊讶,尽管对于非常类似的示例,它在unsat和unknown之间切换有点令人惊讶

如果它适用于您的应用程序,您可以尝试类型强制:将常量编码为
Real
而不是
Int
。这将允许您使用Z3的非线性实数算术完整解算器,并使用
check sat
返回
unsat

或者,您可以强制Z3使用非线性解算器,即使对于整数编码,也可以使用
(使用qfnra nlsat检查sat)
,如下所示(rise4fun链接:):

(声明常量为Int)
(声明常量b Int)
(声明常数c Int)
(断言(>a0))
(断言(>b0))
(断言(>c0))

(断言(非常感谢您的快速回答!将int替换为Reals很有趣-我将考虑何时/何地可以尝试。不幸的是,问题来自程序验证程序的上下文,在这种情况下,除了这种算术之外,还可以显示一些任意属性。因此,我不确定我们是否能够合理地使用Re不幸的是,所有的技巧都很糟糕。同样,我们生成的(检查sat)通常需要使用许多解算器、电子匹配等。。
(declare-const a Int)
(declare-const b Int)
(declare-const c Int)

(assert (> a 0))
(assert (> b 0))
(assert (> c 0))
(assert (<= a b))
(assert (not (<= (* a c) (* b c))))
(check-sat)
(assert (<= a (+ b 1)))
(assert (not (<= (* a c) (* (+ b 1) c))))
(check-sat)
(declare-const a Int)
(declare-const b Int)
(declare-const c Int)

(assert (> a 0))
(assert (> b 0))
(assert (> c 0))
(assert (<= a b))
(assert (not (<= (* a c) (* b c))))
;(check-sat)
(check-sat-using qfnra-nlsat) ; unsat
(assert (<= a (+ b 1)))
(assert (not (<= (* a c) (* (+ b 1) c))))
; (check-sat)
(check-sat-using qfnra-nlsat) ; unsat