我试图用Z3解决以下问题:
(declare-const b String)
(assert (= 3 (str.indexof "abcdef" b)))
(check-sat)
(get-model)
我得到一个结果:
sat
(model
(define-fun b () String
"de")
)
但是,当我尝试使用Z3解决以下问题时:
(declare-const b String)
(assert (= 4 (str.indexof "abcdef" b)))
(check-sat)
(get-model)
但是我得到了结果:
unknown
Z3(4, 10): ERROR: model is not available
这是一个错误吗?
答案 0 :(得分:0)
unknown
在这里不是理想的答案,但也不是bug。这仅表示z3无法构建模型来满足您的约束,但也无法确定它们也不是不令人满意的。弦论的可判定性是一个悬而未决的问题,因此不足为奇。
顺便说一句,您必须使用旧版本的z3。使用您的脚本时,我得到:
$ z3 smt.string_solver=z3str3 a.smt2
sat
(model
(define-fun b () String
"d")
)
和
$ z3 smt.string_solver=z3str3 a.smt2
sat
(model
(define-fun b () String
"e")
)
分别。因此,看起来情况确实有所改善!
请注意,z3附带了多个字符串求解器,并且命令行参数smt.string_solver=z3str3
选择了z3str3
(最近的化身)。允许的值为:
z3str3
:专业的字符串求解器seq
:序列求解器auto
:使用静态功能选择最佳求解器不幸的是,这里没有一个明确的选择。通常,您需要尝试所有方法,看看哪种方法最适合您。 (并且,如果他们不同意sat
/ unsat
,请报告为bug!区别仅在于性能方面。)