Z3不解决量词表达式,表达式是sat
使用z3 v 4.8.1--64位编译哈希代码016872a5e0f6,下面的脚本计算为Z3不解决量词表达式,表达式是sat,z3,smt,Z3,Smt,使用z3 v 4.8.1--64位编译哈希代码016872a5e0f6,下面的脚本计算为unsat,但预期结果为sat z3支持这样的表达式求解吗 一个不同的smt解算器可以解决这样的表达式吗 (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)) (=&
unsat
,但预期结果为sat
- z3支持这样的表达式求解吗
- 一个不同的smt解算器可以解决这样的表达式吗
(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)
(设置选项:打印成功错误) (全部设置逻辑) (按1) (声明常量ss1 Int) (声明常量ss3 Int) (断言(对于所有((t_ss3 Int)(t_ss1 Int)) (=> (
Q是否满足要求”) (检查sat) (流行音乐1)
- Z3在这里是正确的;您提出的脚本确实是
unsat
。你是这么说的:
- 设有两个常数
和ss1
ss3
- 对于所有整数
和t_ss3
,只要t_ss1
成立,则必须是以下情况:t_ss1
ss1
- 而且,
等于t_ss1
ss1
- 而且,
等于t_ss3
ss3
t\u ss1
和t\u ss3
。没有任何ss1
和ss3
能够满足所有t_ss1
和t_ss2
的要求。你只需要看最后一句话:你不能期望所有的t_ss3
都等于任意的ss3
我怀疑你是想表达一些其他的属性;但是您没有正确地编写代码。也许你想说如果t_ss1
等于ss1
和t_ss3
等于ss3
,和t_ss1
,那么ss1
?其编码如下所示:
(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)
(声明常量ss1 Int)
(声明常量ss3 Int)
(断言(对于所有((t_ss3 Int)(t_ss1 Int))
(=>(和(
而且确实会产生sat
如果您能更好地描述您想要表达的内容,您可以在SMT库中的另一个问题中获得更好的建模帮助。Z3在这里是正确的;您提出的脚本确实是
unsat
。你是这么说的:
- 设有两个常数
和ss1
ss3
- 对于所有整数
和t_ss3
,只要t_ss1
成立,则必须是以下情况:t_ss1
ss1
- 而且,
等于t_ss1
ss1
- 而且,
等于t_ss3
ss3
t\u ss1
和t\u ss3
。没有任何ss1
和ss3
能够满足所有t_ss1
和t_ss2
的要求。你只需要看最后一句话:你不能期望所有的t_ss3
都等于任意的ss3
我怀疑你是想表达一些其他的属性;但是您没有正确地编写代码。也许你想说如果t_ss1
等于ss1
和t_ss3
等于ss3
,和t_ss1
,那么ss1
?其编码如下所示:
(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)
(声明常量ss1 Int)
(声明常量ss3 Int)
(断言(对于所有((t_ss3 Int)(t_ss1 Int))
(=>(和(
而且确实会产生sat
如果您能够更好地描述您想要表达的内容,那么您可以在SMT库中的另一个问题中获得更好的帮助