Klein Group的产品表是:
使用以下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组的这种表示来求解方程?换句话说,如何将assert
与eval
合并?
答案 0 :(得分:1)
一个选项是创建一个新的输入文件,其中包含Z3生成的模型中的定义。例如,假设我们想要求解方程式
x*a*b = a
我们可以使用Z3生成的定义和额外的断言
创建一个新问题 (declare-const x S)
(assert (= (f (f x a) b) a))
Here就是一个完整的例子。
我们还可以使用Z3编程API自动完成整个过程(并避免手动复制和粘贴)。