नीचे दिखाए गए Z3 स्क्रिप्ट में, मेरे तीन संबंध हैं - सत्र-आदेश (so), दृश्यता (vis), और होता है-पहले (hb)। बाधाओं में से एक प्रभावी रूप से hb = so ∪ vis पर जोर देता है, जहां से यह उस ∀a,b. so(a,b) ⇒ hb(a,b) का अनुसरण करता है। दूसरे शब्दों में, दो स्थिरांक E1 और E2 के लिए, अवरोध (so E1 E2) और (not (hb E1 E2)) एक साथ संतोषजनक नहीं हैं। जैसा कि अपेक्षित था, अगर मैं दोनों का दावा करता हूं तो Z3 UNSAT लौटाता है। हालांकि, अगर मैं अब (not (hb E1 E2)) और check-sat को फिर से हटा देता हूं, तो Z3 एक मॉडल देता है जहां (so E1 E2) का मूल्यांकन सही होता है, लेकिन (hb E1 E2) का मूल्यांकन गलत होता है (देखें eval अंत में बयान)। यह कैसे संभव है? सही मॉडल पाने के लिए किसी भी कामकाज की भी बहुत सराहना की जाती है!

मैं Z3 को पास करने वाले विकल्प smt.auto-config=false smt.mbqi=true smt.macro-finder=true हैं, और Z3 संस्करण मैं 4.8.0 का उपयोग करता हूं।

(declare-sort Eff) ; type of an effect
(declare-sort Ssn) ; type of a session
(declare-sort Oper) ; type of an operation
(declare-fun seqno (Eff) Int) ; each effect has a seqno
(declare-fun ssn (Eff) Ssn)
(declare-fun oper (Eff) Oper)
(declare-fun so (Eff Eff) Bool) ; session order
(declare-fun vis (Eff Eff) Bool) ; visibility
(declare-fun hb (Eff Eff) Bool) ; happens-before
(declare-fun NOP () Oper)
(declare-fun District_IncNextOID () Oper)
(declare-fun District_Add () Oper)
(declare-fun District_Get () Oper)
(declare-fun E2 () Eff)
(declare-fun E1 () Eff)
(declare-fun E0 () Eff)
;;
;; Cardinality constraints
;;
(assert (forall ((a0 Eff))
  (or (= a0 E0)
      (= a0 E1)
      (= a0 E2)
      )))
(assert (distinct E0 E1 E2 ))
(assert (forall ((a0 Oper))
  (or (= a0 District_Get)
      (= a0 District_Add)
      (= a0 District_IncNextOID)
      (= a0 NOP))))
(assert (distinct 
          District_Get
          District_Add
          District_IncNextOID
          NOP))
;;
;; Axioms
;;
;; session order relates sequential effects in 
;; the same session
(assert (forall ((a0 Eff) (a1 Eff))
  (let ((a!1 (and (not (= (oper a0) NOP))
                  (not (= (oper a1) NOP))
                  (= (ssn a0) (ssn a1))
                  (< (seqno a0) (seqno a1)))))
    (= (so a0 a1) a!1))))
;; session-order is transitive
(assert (forall ((a0 Eff) (a1 Eff) (a2 Eff))
  (=> (and (so a0 a1) (so a1 a2)) (so a0 a2))))
;; visibility is irreflexive
(assert (forall ((a0 Eff)) (not (vis a0 a0))))
;; visibility is anti-symmetric
(assert (forall ((a0 Eff) (a1 Eff)) 
  (=> (and (vis a0 a1) (vis a1 a0)) (= a0 a1))))
;; happens-before is (so ∪ vis)
(assert (forall ((a0 Eff) (a1 Eff)) 
  (=> (or (vis a0 a1) (so a0 a1)) (hb a0 a1))))
;; happens-before is transitive
(assert (forall ((a0 Eff) (a1 Eff) (a2 Eff))
  (=> (and (hb a0 a1) (hb a1 a2)) (hb a0 a2))))
;; happens-before is irreflexive
(assert (forall ((a0 Eff)) (not (hb a0 a0))))
;;
;; Check
;;
(assert (so E1 E2))
;(assert (not (hb E1 E2)))
(check-sat)
(get-model)
(eval (so E1 E2)) ; returns true
(eval (hb E1 E2)) ; returns false. Why?
z3
0
Gowtham Kaki 25 अक्टूबर 2018, 17:04

1 उत्तर

सबसे बढ़िया उत्तर

मुझे लगता है कि यह एक z3 बग है, और मुझे संदेह है कि यह मैक्रो-फाइंडर विकल्प के साथ है। यदि आप smt.macro-finder=true तर्क को हटा देते हैं (या बिना किसी तर्क के कॉल करते हैं), तो आपको यह समस्या नहीं है।

आपको निश्चित रूप से उनके जीथब ट्रैकर पर रिपोर्ट करना चाहिए। (जो मुझे विश्वास है कि आप पहले ही कर चुके हैं!)

मॉडलिंग के संबंध में: क्या आपने declare-datatypes मॉडलिंग Eff और Oper के लिए प्रयास किया था? आप उन्हें सरल रचनाकार बना सकते हैं और इस प्रकार उनके लिए कार्डिनैलिटी बाधाओं से छुटकारा पा सकते हैं। (वे स्वचालित रूप से अनुमान लगाए जाएंगे।) आप परिमाणीकरण के बजाय ऐसे डेटाटाइप मॉडलिंग के आंतरिक तंत्र का उपयोग करके बेहतर लाभ प्राप्त कर सकते हैं।

2
alias 25 अक्टूबर 2018, 19:49