Я хочу использовать z3 для BMC с помощью muZ. Может быть, я упустил что-то относительно определения выполнимости запроса. Однако в следующем случае у меня есть пример запроса, который не является выполнимым (т. Е. Возвращает «false»), но при добавлении дополнительного ограничения (которое эффективно дает удовлетворяющее присваивание) возвращается правильное присваивание.Разрешимые запросы в muZ
Есть ли какая-либо документация, помогающая понять точную семантику расширения языка muZ z3?
Спасибо и с наилучшими пожеланиями !!
Выполнение следующей .smt2-файл с Z3 версии 4.3.2 приводит к следующему результату:
formula undetermined in model: (= (head query!0_0_n) (state c1 1))
sat
false
sat
(let ((a!1 (insert (state c1 1) (insert (state c2 0) (insert (state c1 0) nil))))
(a!2 (TransClosure (insert (state c2 0) (insert (state c1 0) nil)))))
(and (TransClosure a!1) a!2 (TransClosure (insert (state c1 0) nil))))
Соответствующий .smt2-файл является:
;; Application of z3Mu for BMC of EFSM
;; Behavior of EFSM is defined recursively as a predicate over finite sequences (Lists) of states
;; Declaration of state space
(declare-datatypes() ((Control c1 c2)))
(declare-datatypes() ((State (state (cstate Control) (var Int)))))
;; Definition of transition relation and initial state
(declare-rel Trans (State State))
(declare-var pre State)
(declare-var post State)
(rule (=> (and (= (cstate pre) c1) (= (cstate post) c2) (= (+ (var pre) 0) (var post))) (Trans post pre)))
(rule (=> (and (= (cstate pre) c2) (= (cstate post) c1) (= (+ (var pre) 1) (var post))) (Trans post pre)))
;; Definition of fixed-point closure
(declare-var init State)
(declare-var trace (List State))
(declare-rel Init (State))
(rule (Init (state c1 0)))
(declare-rel TransClosure ((List State)))
(rule (=> (and (Trans (head trace) (head (tail trace))) (TransClosure (tail trace)))
(TransClosure trace)))
(rule (=> (Init init) (TransClosure (insert init nil))))
;; Query for a witness which is satifiable in three steps
;; Query without explicit witness construction fails
(query (and (= (head trace) (state c1 1))
(TransClosure trace)
)
:print-answer true)
;; Same query with explicit witness succeeds
(query (and (= (head trace) (state c1 1))
(TransClosure trace)
(= trace (insert (state c1 1) (insert (state c2 0) (insert (state c1 0) nil))))
)
:print-answer true)