Z3Prover / z3

The Z3 Theorem Prover
Other
10.28k stars 1.48k forks source link

Sequence models are still self referential #2030

Closed LeventErkok closed 5 years ago

LeventErkok commented 5 years ago

This is a follow-up to #2019

That benchmark is now producing unsat; but I'm still seeing the self-referential models coming out from z3 that I built just now: Here's an example benchmark:

(set-option :produce-models true)
(set-logic ALL)
(define-fun s4 () Int 1)
(define-fun s15 () Int 0)
(define-fun s2 () (Seq Int) (as seq.empty (Seq Int)))
(declare-fun s0 () Int) ; tracks user variable "x"
(declare-fun s1 () (Seq Int)) ; tracks user variable "xs"
(declare-fun s13 () Int) ; tracks user variable "__internal_sbv_s13"
(declare-fun s23 () Int) ; tracks user variable "__internal_sbv_s23"
(declare-fun s41 () Int) ; tracks user variable "__internal_sbv_s41"
(declare-fun s50 () Int) ; tracks user variable "__internal_sbv_s50"
(declare-fun s72 () Int) ; tracks user variable "__internal_sbv_s72"
(declare-fun s81 () Int) ; tracks user variable "__internal_sbv_s81"
(declare-fun s99 () Int) ; tracks user variable "__internal_sbv_s99"
(declare-fun s108 () Int) ; tracks user variable "__internal_sbv_s108"
(declare-fun rev ((Seq Int)) (Seq Int))
(define-fun s3 () Bool (= s1 s2))
(define-fun s5 () Int (seq.len s1))
(define-fun s6 () Int (- s5 s4))
(define-fun s7 () (Seq Int) (seq.extract s1 s4 s6))
(define-fun s8 () Bool (= s2 s7))
(define-fun s9 () Int (seq.len s7))
(define-fun s10 () Int (- s9 s4))
(define-fun s11 () (Seq Int) (seq.extract s7 s4 s10))
(define-fun s12 () (Seq Int) (rev s11))
(define-fun s14 () (Seq Int) (seq.unit s13))
(define-fun s16 () Bool (> s9 s15))
(define-fun s17 () Bool (not s16))
(define-fun s18 () (Seq Int) (seq.extract s7 s15 s4))
(define-fun s19 () Bool (= s14 s18))
(define-fun s20 () Bool (or s17 s19))
(define-fun s21 () (Seq Int) (seq.++ s12 s14))
(define-fun s22 () (Seq Int) (ite s8 s2 s21))
(define-fun s24 () (Seq Int) (seq.unit s23))
(define-fun s25 () Bool (> s5 s15))
(define-fun s26 () Bool (not s25))
(define-fun s27 () (Seq Int) (seq.extract s1 s15 s4))
(define-fun s28 () Bool (= s24 s27))
(define-fun s29 () Bool (or s26 s28))
(define-fun s30 () (Seq Int) (seq.++ s22 s24))
(define-fun s31 () (Seq Int) (ite s3 s2 s30))
(define-fun s32 () Bool (= s2 s31))
(define-fun s33 () Int (seq.len s31))
(define-fun s34 () Int (- s33 s4))
(define-fun s35 () (Seq Int) (seq.extract s31 s4 s34))
(define-fun s36 () Bool (= s2 s35))
(define-fun s37 () Int (seq.len s35))
(define-fun s38 () Int (- s37 s4))
(define-fun s39 () (Seq Int) (seq.extract s35 s4 s38))
(define-fun s40 () (Seq Int) (rev s39))
(define-fun s42 () (Seq Int) (seq.unit s41))
(define-fun s43 () Bool (> s37 s15))
(define-fun s44 () Bool (not s43))
(define-fun s45 () (Seq Int) (seq.extract s35 s15 s4))
(define-fun s46 () Bool (= s42 s45))
(define-fun s47 () Bool (or s44 s46))
(define-fun s48 () (Seq Int) (seq.++ s40 s42))
(define-fun s49 () (Seq Int) (ite s36 s2 s48))
(define-fun s51 () (Seq Int) (seq.unit s50))
(define-fun s52 () Bool (> s33 s15))
(define-fun s53 () Bool (not s52))
(define-fun s54 () (Seq Int) (seq.extract s31 s15 s4))
(define-fun s55 () Bool (= s51 s54))
(define-fun s56 () Bool (or s53 s55))
(define-fun s57 () (Seq Int) (seq.++ s49 s51))
(define-fun s58 () (Seq Int) (ite s32 s2 s57))
(define-fun s59 () Bool (= s1 s58))
(define-fun s60 () Bool (not s59))
(define-fun s61 () (Seq Int) (seq.unit s0))
(define-fun s62 () (Seq Int) (seq.++ s61 s1))
(define-fun s63 () Bool (= s2 s62))
(define-fun s64 () Int (seq.len s62))
(define-fun s65 () Int (- s64 s4))
(define-fun s66 () (Seq Int) (seq.extract s62 s4 s65))
(define-fun s67 () Bool (= s2 s66))
(define-fun s68 () Int (seq.len s66))
(define-fun s69 () Int (- s68 s4))
(define-fun s70 () (Seq Int) (seq.extract s66 s4 s69))
(define-fun s71 () (Seq Int) (rev s70))
(define-fun s73 () (Seq Int) (seq.unit s72))
(define-fun s74 () Bool (> s68 s15))
(define-fun s75 () Bool (not s74))
(define-fun s76 () (Seq Int) (seq.extract s66 s15 s4))
(define-fun s77 () Bool (= s73 s76))
(define-fun s78 () Bool (or s75 s77))
(define-fun s79 () (Seq Int) (seq.++ s71 s73))
(define-fun s80 () (Seq Int) (ite s67 s2 s79))
(define-fun s82 () (Seq Int) (seq.unit s81))
(define-fun s83 () Bool (> s64 s15))
(define-fun s84 () Bool (not s83))
(define-fun s85 () (Seq Int) (seq.extract s62 s15 s4))
(define-fun s86 () Bool (= s82 s85))
(define-fun s87 () Bool (or s84 s86))
(define-fun s88 () (Seq Int) (seq.++ s80 s82))
(define-fun s89 () (Seq Int) (ite s63 s2 s88))
(define-fun s90 () Bool (= s2 s89))
(define-fun s91 () Int (seq.len s89))
(define-fun s92 () Int (- s91 s4))
(define-fun s93 () (Seq Int) (seq.extract s89 s4 s92))
(define-fun s94 () Bool (= s2 s93))
(define-fun s95 () Int (seq.len s93))
(define-fun s96 () Int (- s95 s4))
(define-fun s97 () (Seq Int) (seq.extract s93 s4 s96))
(define-fun s98 () (Seq Int) (rev s97))
(define-fun s100 () (Seq Int) (seq.unit s99))
(define-fun s101 () Bool (> s95 s15))
(define-fun s102 () Bool (not s101))
(define-fun s103 () (Seq Int) (seq.extract s93 s15 s4))
(define-fun s104 () Bool (= s100 s103))
(define-fun s105 () Bool (or s102 s104))
(define-fun s106 () (Seq Int) (seq.++ s98 s100))
(define-fun s107 () (Seq Int) (ite s94 s2 s106))
(define-fun s109 () (Seq Int) (seq.unit s108))
(define-fun s110 () Bool (> s91 s15))
(define-fun s111 () Bool (not s110))
(define-fun s112 () (Seq Int) (seq.extract s89 s15 s4))
(define-fun s113 () Bool (= s109 s112))
(define-fun s114 () Bool (or s111 s113))
(define-fun s115 () (Seq Int) (seq.++ s107 s109))
(define-fun s116 () (Seq Int) (ite s90 s2 s115))
(define-fun s117 () Bool (= s62 s116))
(define-fun s118 () Bool (or s60 s117))
(assert s20)
(assert s29)
(assert s47)
(assert s56)
(assert s78)
(assert s87)
(assert s105)
(assert s114)
(assert (not s118))
(check-sat)
(get-value (s1))
NikolajBjorner commented 5 years ago

at least this model now looks sane.

LeventErkok commented 5 years ago

Looks good to me; did some extra testing and didn't see anything funky. Thanks!