假设我有一个用户定义的可交换和关联运算符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可能没有指导使其独立出现。
我能做得更好吗?
谢谢! 西蒙
答案 0 :(得分:1)
Z3对匹配模A,C,AC,ACI没有任何特殊支持。 对于您给出的特定示例,假设1是 更重要的是,但这只是这个特殊例子的一件神器。