我有一个简单的公式,包含数组的量词,Z3(4.3.2)返回“unknown”。
(assert (forall ((a (Array Int Int)) (b (Array Int Int))) (=> (forall ((i Int)) (= (select a i) (select b i))) (= a b))))
(check-sat)
详细信息是:
(simplifier :num-exprs 12 :num-asts 185 :time 0.00 :before-memory 2.49 :after-memory 2.49)
(smt.simplifier-done)
(smt.searching)
(smt.mbqi)
(smt.simplifier-done)
(smt.searching)
(smt.simplifying-clause-set :num-deleted-clauses 1)
(smt.simplifier-done)
(smt.searching)
(smt.simplifying-clause-set :num-deleted-clauses 1)
(smt.mbqi :failed k!1)
(smt.restarting :propagations 0 :decisions 0 :conflicts 0 :restart 100 :agility 0.00)
(tactic-exception "smt tactic failed to show goal to be sat/unsat")
似乎Z3允许这种公式。从我对冗长的不完全理解中,我是否错过了一些使用的策略?你能帮忙解决这个公式吗?
答案 0 :(得分:3)
Z3 tutorial(Section Quantifiers)描述Z3完成的片段。一般问题是不可判定的。
关于您的示例,Z3将在包含数组范围的量词的可满足实例上失败。 请注意,您的公式是可以满足的。 如果我们否定它,那么Z3会自动证明它是不可满足的。
(assert (not (forall ((a (Array Int Int)) (b (Array Int Int)))
(=> (forall ((i Int)) (= (select a i) (select b i))) (= a b)))))
(check-sat)
备注:Z3本质上是一种可满足性检查器。为证明公式F
,我们证明否定是不可满足的。
答案 1 :(得分:1)
实际上,您可以先尝试消除量词。 使用Tactic' qe' qe-sat'或者' qe-light'可能有帮助。 我尝试了它,似乎变成了“真实”。