这个表达真的不太好吗?

时间:2014-02-28 09:47:13

标签: z3

我正在调试我的代码,然后我遇到z3说这个表达式不够

(and (not (>= s 13))
     (>= s 0)
     (>= 13 s)
     (>= pc0_thread1 0)
     (>= pc1_thread1 0)
     (>= pc2_thread1 0)
     (>= pc3_thread1 0)
     (>= pc4_thread1 0)
     (>= pc0_main 0)
     (>= pc0_thread2 0)
     (>= pc1_thread2 0)
     (= 1 pc0_main))

我很惊讶并试图使用unsat_core函数,但它返回一个空数组。 我错过了什么吗?

3 个答案:

答案 0 :(得分:2)

我正在获得“坐”

(declare-fun s () Real)
(declare-fun pc0_thread1 () Real)
(declare-fun pc1_thread1 () Real)
(declare-fun pc2_thread1 () Real)
(declare-fun pc3_thread1 () Real)
(declare-fun pc4_thread1 () Real)
(declare-fun pc0_main () Real)
(declare-fun pc0_thread2 () Real)
(declare-fun pc1_thread2 () Real)
(assert (and (not (>= s 13))
 (>= s 0)
 (>= 13 s)
 (>= pc0_thread1 0)
 (>= pc1_thread1 0)
 (>= pc2_thread1 0)
 (>= pc3_thread1 0)
 (>= pc4_thread1 0)
 (>= pc0_main 0)
 (>= pc0_thread2 0)
 (>= pc1_thread2 0)
 (= 1 pc0_main)))

(检查-SAT)

在线here

运行此示例

答案 1 :(得分:1)

像Juan一样,我得到了SAT,但我用整数尝试过它:

(declare-const s Int)
(declare-const pc0_thread1 Int)
(declare-const pc1_thread1 Int)
(declare-const pc2_thread1 Int)
(declare-const pc3_thread1 Int)
(declare-const pc4_thread1 Int)
(declare-const pc0_main Int)
(declare-const pc0_thread2 Int)
(declare-const pc1_thread2 Int)

(assert (and (not (>= s 13))
  (>= s 0)
  (>= 13 s)
  (>= pc0_thread1 0)
  (>= pc1_thread1 0)
  (>= pc2_thread1 0)
  (>= pc3_thread1 0)
  (>= pc4_thread1 0)
  (>= pc0_main 0)
  (>= pc0_thread2 0)
  (>= pc1_thread2 0)
  (= 1 pc0_main))
)

(check-sat)

Zeinab:我认为你没有使用SMT2前端,而是使用API​​。你能给我们更多关于你用这个表达做什么的信息吗?例如,我们最近有一个关于ctx-solver简化策略的错误报告,提供了错误的结果(参见here),但我必须确切地知道你的目标是什么以及你正在应用哪种策略。 / p>

答案 2 :(得分:1)

我的错误是我在循环中使用“求解器”,但我没有每次都重置,所以它有来自先前循环迭代的信息,因此产生错误的结果。 在打印solver.assertions()之后,我弄清楚发生了什么!

谢谢大家。