如何在集合上带有量词的公式上使用Z3?

如何在集合上带有量词的公式上使用Z3?,z3,quantifiers,Z3,Quantifiers,我有一个简单的公式,其中包含数组集合上的量词,Z3(4.3.2)返回“未知” 详细内容如下: (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-s

我有一个简单的公式,其中包含数组集合上的量词,Z3(4.3.2)返回“未知”

详细内容如下:

(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似乎允许这种公式。由于我对冗长的内容理解不全面,我是否错过了一些可以使用的策略?你能帮我解这个公式吗?

节量词描述了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
,我们证明了否定是不可满足的。

(节量词)描述了哪些片段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将在包含数组上的量词的可满足实例上失败。 请注意,您的公式是可满足的。 如果我们否定它,那么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
,我们证明了否定是不可满足的。

实际上,你可以尝试先去掉量词。
(assert (not (forall ((a (Array Int Int)) (b (Array Int Int))) 
             (=> (forall ((i Int)) (= (select a i) (select b i))) (= a b)))))
(check-sat)
使用策略“qe”、“qe sat”或“qe light”可能会有所帮助。
我试过了,它似乎变成了“真的”。

实际上,你可以试着先去掉量词。 使用策略“qe”、“qe sat”或“qe light”可能会有所帮助。 我试过了,它似乎变成了“真的”