我正在调试我的代码,然后我遇到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函数,但它返回一个空数组。 我错过了什么吗?
答案 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()之后,我弄清楚发生了什么!
谢谢大家。