如何使用Z3 SMT-LIB求解Klein群中的方程

时间:2013-11-21 14:14:40

标签: z3

Klein Group的产品表是:

enter image description here

使用以下Z3 SMT-LIB代码可以获得Klein Group的代表:

(set-option :mbqi true)
(declare-sort S)
(declare-fun f (S S) S)
(declare-const a S)
(declare-const b S)
(declare-const c S)
(declare-const d S)
(assert (forall ((x S) (y S))
            (= (f x y)  (f y x))))
(assert (forall ((x S))
            (= (f x d) x)))
(assert (forall ((x S))
            (= (f x x) d)))                
(assert (= (f a b) c))
(assert (= (f a c) b))
(assert (= (f b c) a))
(check-sat)
(get-model)

,相应的输出是:

sat 
(model 
;; universe for S: 
;; S!val!1 S!val!3 S!val!0 S!val!2
;; ----------- 
;; definitions for universe elements: 
(declare-fun S!val!1 () S) 
(declare-fun S!val!3 () S) 
(declare-fun S!val!0 () S) 
(declare-fun S!val!2 () S) 
;; cardinality constraint: 
(forall ((x S)) (or (= x S!val!1) (= x S!val!3) (= x S!val!0) (= x S!val!2))) 
;; ----------- 
(define-fun b () S S!val!1) 
(define-fun a () S S!val!0) 
(define-fun c () S S!val!2) 
(define-fun d () S S!val!3) 
(define-fun f ((x!1 S) (x!2 S)) S 
  (ite (and (= x!1 S!val!0) (= x!2 S!val!1)) S!val!2 
  (ite (and (= x!1 S!val!0) (= x!2 S!val!2)) S!val!1 
  (ite (and (= x!1 S!val!1) (= x!2 S!val!2)) S!val!0 
  (ite (and (= x!1 S!val!1) (= x!2 S!val!0)) S!val!2 
  (ite (and (= x!1 S!val!2) (= x!2 S!val!0)) S!val!1 
  (ite (and (= x!1 S!val!2) (= x!2 S!val!1)) S!val!0 
  (ite (and (= x!1 S!val!0) (= x!2 S!val!3)) S!val!0 
  (ite (and (= x!1 S!val!3) (= x!2 S!val!0)) S!val!0 
  (ite (and (= x!1 S!val!3) (= x!2 S!val!2)) S!val!2 
  (ite (and (= x!1 S!val!2) (= x!2 S!val!3)) S!val!2 
  (ite (and (= x!1 S!val!1) (= x!2 S!val!3)) S!val!1 
  (ite (and (= x!1 S!val!3) (= x!2 S!val!1)) S!val!1 
  (ite (= x!2 x!1) S!val!3 x!1)))))))))))))) 
  )

使用此表示可以在Klein组中进行计算:

(eval (f a b))
(eval (f (f a b) (f c d)))
(eval (f (f (f a b) (f c d)) (f (f a c) (f b d))))

,相应的结果是:

S!val!2
S!val!3 
S!val!3

在线here

运行此示例

问题是:如何使用Klein组的这种表示来求解方程?换句话说,如何将asserteval合并?

1 个答案:

答案 0 :(得分:1)

一个选项是创建一个新的输入文件,其中包含Z3生成的模型中的定义。例如,假设我们想要求解方程式

  x*a*b = a

我们可以使用Z3生成的定义和额外的断言

创建一个新问题
 (declare-const x S)
 (assert (= (f (f x a) b) a))

Here就是一个完整的例子。

我们还可以使用Z3编程API自动完成整个过程(并避免手动复制和粘贴)。