使用z3 v 4.8.1--64位-建立哈希码016872a5e0f6,以下脚本的评估结果为unsat
,但预期结果为sat
。
不同的smt-solver可以解决此类表达式吗?
(set-option :print-success false)
(set-logic ALL)
(push 1)
(declare-const ss1 Int)
(declare-const ss3 Int)
(assert (forall ((t_ss3 Int)(t_ss1 Int))
(=>
(< t_ss1 t_ss3)
(and (and
(< ss1 ss3)
(= t_ss1 ss1))
(= t_ss3 ss3))
)))
(echo "Check if the P -> Q is satisfiable")
(check-sat)
(pop 1)
答案 0 :(得分:2)
Z3在这里是正确的;您所构成的脚本确实是unsat
。这就是你说的:
ss1
和ss3
对于所有整数t_ss3
和t_ss1
,只要t_ss1 < t_ss3
成立,就必须满足以下条件:
ss1 < ss3
t_ss1
等于ss1
t_ss3
等于ss3
对于所有t_ss1
和t_ss3
显然不是这样。对于 ALL ss1
和ss3
,没有t_ss1
和t_ss2
可以满足此要求。您只需要查看最后一个子句:您不能期望所有t_ss3
等于任意ss3
。
我怀疑您正在尝试表达其他财产;但是您没有正确编码。也许您是想说t_ss1
等于ss1
和t_ss3
等于ss3
和t_ss1 < t_ss3
,然后ss1 < ss3
吗?该代码将如下所示:
(declare-const ss1 Int)
(declare-const ss3 Int)
(assert (forall ((t_ss3 Int) (t_ss1 Int))
(=> (and (< t_ss1 t_ss3)
(= t_ss1 ss1)
(= t_ss3 ss3))
(< ss1 ss3))))
(check-sat)
并确实会产生sat
。
如果您对要表达的内容有更好的描述,则可以在其他问题中使用SMT-Lib对其建模获得更好的帮助。