Z3无法证明群论中的正确抵消属性?

时间:2014-01-23 02:16:58

标签: z3 z3py

我试图证明群论中的一些一般属性。

例如,左取消属性:(x y = x z)=> (y = z)它使用以下代码证明

(declare-sort S)
(declare-fun e () S)
(declare-fun mult (S S) S)
(declare-fun inv (S) S)
(assert (forall ((x S) (y S) (z S)) (= (mult (mult x y) z) (mult x (mult y z)))))
(assert (forall ((x S)) (= (mult e x)  x)))
(assert (forall ((x S)) (= (mult (inv x) x) e)))
(assert (forall ((x S)) (= (mult x e)  x)))
(assert (forall ((x S)) (= (mult x (inv x)) e)))
(check-sat)
(assert (not (forall ((x S) (y S) (z S)) (=> (= (mult x y) (mult x z)) (= y z)))))
(check-sat)

,相应的输出是:

sat
unsat

现在,当我尝试证明正确的取消属性时:(y x = z x)=> (y = z)使用以下代码

(declare-sort S)
(declare-fun e () S)
(declare-fun mult (S S) S)
(declare-fun inv (S) S)
(assert (forall ((x S) (y S) (z S)) (= (mult (mult x y) z) (mult x (mult y z)))))
(assert (forall ((x S)) (= (mult e x)  x)))
(assert (forall ((x S)) (= (mult (inv x) x) e)))
(assert (forall ((x S)) (= (mult x e)  x)))
(assert (forall ((x S)) (= (mult x (inv x)) e)))

(check-sat)
(assert (not (forall ((x S) (y S) (z S)) (=> (= (mult y x) (mult z x)) (= y z)))))
(check-sat)

我正在获取

timeout

请告诉我如何证明正确的取消财产或使用Z3是不可能的?

2 个答案:

答案 0 :(得分:4)

据我所知,超定位推理引擎可以更好地处理这种定理。 较早版本的Z3包含一个叠加引擎,但它从较新版本中删除 因为我们已经看到很少用于解决通用代数中的问题。有一些专门用于超位置推理的定理证明,如Vampire,E,SPASS,您可以使用www.TPTP.org提供的工具来试用这些引擎。

答案 1 :(得分:0)

使用Z3的正确取消属性的​​可能证据如下。

(declare-sort S)
(declare-fun e () S)
(declare-fun mult (S S) S)
(declare-fun inv (S) S)
(assert (forall ((x S) (y S) (z S)) (= (mult (mult x y) z) (mult x (mult y z)))))
(assert (forall ((x S) (y S) (z S)) (= (mult x (mult y z)) (mult (mult x y) z))))
(assert (forall ((x S)) (= (mult e x)  x)))
(assert (forall ((x S)) (= (mult (inv x) x) e)))
(assert (forall ((x S)) (= (mult x e)  x)))
(assert (forall ((x S)) (= (mult x (inv x)) e)))
(check-sat)

(push)
(assert (not (forall ((x S) (y S) (z S)) (=> (= (mult (mult y x) (inv x)) 
                                                (mult (mult z x) (inv x) )) (= y z)))))
(check-sat)
(pop)

,各自的输出是

sat
unsat