Z3查找有效置换

Z3查找有效置换,z3,Z3,我试图让Z3找到一个固定大小的序列的所有可能的置换,这些置换满足一些约束条件。但是,到目前为止,我开发的代码遇到了超时错误: (set-option :produce-unsat-cores true) (set-option :produce-models true) ; --------------- Basic Definitions ------------------- (declare-datatypes () ((Obj A B C))) ; --------------- P

我试图让Z3找到一个固定大小的序列的所有可能的置换,这些置换满足一些约束条件。但是,到目前为止,我开发的代码遇到了超时错误:

(set-option :produce-unsat-cores true)
(set-option :produce-models true)

; --------------- Basic Definitions -------------------
(declare-datatypes () ((Obj A B C)))

; --------------- Predicates -------------------------------

(define-sort MyList () (Seq Obj))

(define-fun in_list ((o Obj) (l MyList)) Bool (seq.contains l (seq.unit o)))

(define-fun permutation ((l1 MyList) (l2 MyList)) Bool
                    (forall ((o Obj)) (= (in_list o l1) (in_list o l2))))


; Two difference permutations of the same list
(declare-const l0 MyList)
(declare-const l1 MyList)

(assert (= 2 (seq.len l0)))
(assert (= 2 (seq.len l1)))
(assert (not (= l1 l0)))
(assert (permutation l0 l1))

; --------------- Verify -------------------
(check-sat)
(get-model)

看起来这应该是一个非常简单的解决方案(即使是蛮力也需要毫秒),所以我很困惑是什么导致了超时。有什么帮助吗?

当存在量词时,Z3所能做的事情已经到了极限

您可能想看看这个问题:


在本例中,问题是关于一般的集合运算,但我认为您也会找到适用于您的案例的答案。(简而言之,禁用MBQI,看看是否可以使用函数而不是序列。)

好奇的是,就可用的解算器而言,你知道Z3目前是否是最先进的吗?这是你认为会随着时间的推移而改善的事情,还是更根本的问题?解决者总是在改进。如果你对量词和序列感兴趣,那么Z3和CVC4可能是目前最好的选择。但请记住,无论何时出现量词,您都必须对解算器提供相当多的帮助。(就提供匹配模式而言)此外,任何需要归纳的证据都是遥不可及的。对于一般数据结构和归纳推理,定理证明者(Isabelle、HOL、Coq、Lean)是目前最好的选择。(当然,这都是我的主观意见,所以请恕我直言。)