Z3型号不正确

Z3型号不正确,z3,Z3,我正在研究在无向图中寻找哈密顿圈的问题。但是最近的一个实验产生了一个本不可能的模型。以下是输入: ;number of vertices = 4 ;5 edges: ;e1 = 0 1 ;e2 = 1 2 ;e3 = 2 3 ;e4 = 3 0 ;e5 = 1 3 (declare-const v0 Bool) (declare-const v1 Bool) (declare-const v2 Bool) (declare-const v3 Bool) (declare-const e1 B

我正在研究在无向图中寻找哈密顿圈的问题。但是最近的一个实验产生了一个本不可能的模型。以下是输入:

;number of vertices = 4
;5 edges:
;e1 = 0 1
;e2 = 1 2
;e3 = 2 3
;e4 = 3 0
;e5 = 1 3

(declare-const v0 Bool)
(declare-const v1 Bool)
(declare-const v2 Bool)
(declare-const v3 Bool)

(declare-const e1 Bool)
(declare-const e2 Bool)
(declare-const e3 Bool)
(declare-const e4 Bool)
(declare-const e5 Bool)

(assert (xor (and e2 e3 e4 e5) (and e1 e3 e4 e5) (and e1 e2 e4 e5) (and e1 e2 e3 e5) (and e1 e2 e3 e4)))

(assert (and v0 v1 v2 v3))

;(assert (=> (and e2 e3 e4 e5) (and v0 v1 v2 v3)))
;(assert (=> (and e1 e3 e4 e5) (and v0 v1 v2 v3)))
;(assert (=> (and e1 e2 e4 e5) (and v0 v1 v2 v3)))
;(assert (=> (and e1 e2 e3 e5) (and v0 v1 v2 v3)))
;(assert (=> (and e1 e2 e3 e4) (and v0 v1 v2 v3)))

(assert (=> e1 (or e2 e4 e5)))
(assert (=> e2 (or e1 e3 e5)))
(assert (=> e3 (or e2 e4 e5)))
(assert (=> e4 (or e1 e3 e5)))
(assert (=> e5 (or e1 e2 e4)))

(assert (and (=> e1 e2) (=> e2 e3) (=> e3 e4) (=> e4 e1)))

(check-sat)
(get-model)
以下是显示所有e1、e2、e3、e4和e5为真的输出,尽管输入中的xor语句明确禁止此操作:

sat
(model 
  (define-fun e2 () Bool
    true)
  (define-fun e5 () Bool
    true)
  (define-fun e3 () Bool
    true)
  (define-fun e4 () Bool
    true)
  (define-fun e1 () Bool
    true)
  (define-fun v3 () Bool
    true)
  (define-fun v2 () Bool
    true)
  (define-fun v1 () Bool
    true)
  (define-fun v0 () Bool
    true)
)
有人对这里的问题有什么看法吗


问候。

我不知道您想做什么,但似乎您误用了
xor

由于
(simplify(xor-true))
返回
true
,因此编码不会禁止当前模型

通常,要保证
a1
a2
a3
只有一个true,您可以执行以下操作:

(assert (or a1 a2 a3)) ; at least one true
(assert (and (=> a1 (and (not a2) (not a3))) 
             (=> a2 (and (not a1) (not a3))) 
             (=> a3 (and (not a1) (not a2))))); at most one true

这难道不违背xor的真理表吗?如果其中一个参数为真,则Exclusive or应为真。这是一个包含或。在任何情况下,我如何用smt2语法编写一个独占或?语法很好,但您的参数仅对两个文本是正确的。请参阅我的更新答案,了解至少3个文字。谢谢。我希望避免写得太长。如果运算符被用于错误数量的参数,似乎Z3应该提出投诉。正如我所说的,语法是正确的。但是您错误地理解了
xor
的语义。此外,漫长的道路并没有那么糟糕,因为您无论如何都可以通过脚本生成公式。