如何使用Z3获得幂等拟群的非平凡模型

时间:2014-05-28 20:29:13

标签: z3

我试图使用Z3获得一个幂等拟群的非平凡模型,其代码如下

(set-logic AUFNIRA)
(set-option :macro-finder true)
(set-option :mbqi true)
(set-option :pull-nested-quantifiers true)

(declare-sort S 0)
(declare-fun prod (S S) S)
(declare-fun left (S S) S)
(declare-fun right (S S) S)

(assert (forall ((x S) (y S))
                (= (prod (left x y) y) x)))

(assert (forall ((x S) (y S))
                (= (prod x (right x y) ) y)))

(assert (forall ((x S) (y S))
                (= (left (prod x y) y ) x)))

(assert (forall ((x S) (y S))
                (= (right x (prod x y)) y)))
(assert (forall ((x S)) (= (prod x x) x)   ))

(check-sat)
(get-model)

但我只获得了一个微不足道的模型:

sat
(model
  ;; universe for S:
  ;;   S!val!0
  ;; -----------
  ;; definitions for universe elements:
  (declare-fun S!val!0 () S)
  ;; cardinality constraint:
  (forall ((x S)) (= x S!val!0))
  ;; -----------
  (define-fun elem!3 () S
    S!val!0)
  (define-fun elem!2 () S
    S!val!0)
  (define-fun elem!0 () S
    S!val!0)
  (define-fun elem!1 () S
    S!val!0)
  (define-fun left ((x!1 S) (x!2 S)) S
    S!val!0)
  (define-fun right ((x!1 S) (x!2 S)) S
    S!val!0)
  (define-fun prod ((x!1 S) (x!2 S)) S
    x!1)
)

在线here

运行此示例

请告诉我们如何获得非平凡的模型。非常感谢。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你想找到原始断言的多个sat模型。

我这里有一个沉闷的解决方案。您可以使用与prod,left和right相同的方式定义另一组函数,这些函数名为prod2,left2和right2。同样为它们添加断言。然后,你希望prod2与prod不同。

像这样:

(assert (exists ((x S) (y S)) (not (= (prod x y) (prod2 x y)))))

或者表达意思或者(prod!= prod2,left!= left2,right!= right2)会更合适。 我尝试了一下在线运行,但又回来了#39;超时。我想你必须在你的机器上做这件事。

这可能不是最好的答案,但最好的问候!