1
私は、無向グラフでハミルトニアンサイクルを見つける問題をハッキングしています。しかし、最近の実験では、不可能なモデルでなければならないものが作られました。Z3モデルが正しくない
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)
)
:ここ
;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声明にもかかわらず、真であるとされています。ここで入力されています
ここで何がうまくいかないのか誰にも意見はありますか?
よろしくお願いいたします。
はそれはしかし、XORの真理値表を無視しませんか?排他的であるか、または引数のうちの1つが真である場合はtrueでなければなりません。これは包括的であるかのように振る舞います。 – Schemer
いずれにしても、排他的またはsmt2の構文を書くにはどうすればよいですか? – Schemer
構文は問題ありませんが、引数は2つのリテラルに対してのみ正しいです。少なくとも3つのリテラルについて私の更新された答えを見てください。 – pad