我试图使用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
运行此示例请告诉我们如何获得非平凡的模型。非常感谢。
答案 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;超时。我想你必须在你的机器上做这件事。
这可能不是最好的答案,但最好的问候!