Z3是否具有促进关联/可交换运算符链中子公式匹配的功能?

时间:2014-04-12 20:20:14

标签: z3 matching associativity commutativity

假设我有一个用户定义的可交换和关联运算符op。下面的代码无效,因为我使用带有两个以上参数的op。让我们假设它有效并且意味着" op的应用方式无关紧要"。

(declare-sort T 0)
(declare-fun op (T T) T)
(declare-fun P (T) Bool)
(declare-const a T)
(declare-const b T)
(declare-const c T)
(declare-const d T)
(declare-const k T)
; associativity
(assert (forall ((x T) (y T)) (z T)) 
                (= (op x (op y z)) 
                   (op (op x y) z))))
; commutativity
(assert (forall ((x T) (y T))) 
                (= (op x y) 
                   (op y x))))
; assumption 1
(assert (forall ((x T) (y T)) (= (op x y) k)))
; assumption 2
(assert (P (op a c k)))
; conjecture
(assert (not (P (op a b c d))))

确保假设1用x,y:= b,d实例化并且假设2适用于证明猜想的最佳方法是什么?

我正在考虑的一个解决方案是生成所有可能对应于(op a b c d)的二叉树。然而,这是非常昂贵的:有5种不同的二元树,其中有4片叶子和24种不同的叶子排列,总共120种不同的二叉树。我也可以忍住并希望z3自己使用关联性和可交换性,并触发假设1的正确实例化。

如果我们认为像(op a b c)这样的链可以出现在通用量化中,问题会变得更加毛茸茸。我们可以使用模式(op a(op bc)),(op b(op ac))等来最大化实例化量化的机会,但模式必须出现在某处,而z3可能没有指导使其独立出现。

我能做得更好吗?

谢谢! 西蒙

1 个答案:

答案 0 :(得分:1)

Z3对匹配模A,C,AC,ACI没有任何特殊支持。 对于您给出的特定示例,假设1是 更重要的是,但这只是这个特殊例子的一件神器。