Z3:str.indexof产生意外的答案,为什么?

时间:2018-11-01 01:01:36

标签: string z3

我试图用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

这是一个错误吗?

1 个答案:

答案 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!区别仅在于性能方面。)