在muZ中可解决的查询

时间:2013-09-16 11:08:40

标签: z3

我想使用muZ将B3用于BMC。也许我遗漏了一些关于查询可满足性的定义。但是,在下面的例子中,我有一个不满足的查询示例(即返回“false”),但是当添加一个额外的约束(有效地给出令人满意的赋值)时,返回一个有效的赋值。

是否有任何文档有助于理解z3的muZ语言扩展的确切语义?

谢谢和最好的问候!!

使用Z3版本4.3.2执行以下.smt2文件会产生以下结果:

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)            

1 个答案:

答案 0 :(得分:0)

“模型中未确定的公式”消息表示Z3中存在错误。 错误是Z3接受了输入,没有投诉。它应该在使用PDR后端引擎时拒绝该示例。 PDR后端引擎支持算术,布尔运算和非优化的位向量,以及对代数数据类型的一些支持。它不支持代数数据类型的访问器(头部,尾部),我现在添加了一个检查,在调用搜索之前报告错误并指向使用不支持的访问器。 Z3的不稳定分支包含修复。

可以仅使用“insert”而不是“head”“tail”重写您的示例。 例如,用's1'替换(head t)并用'(insert s t)'替换't'在其他地方。

您可以使用SMT-LIB2中的纯Horn子句和(set-logic HORN)命令来调用其中一个可用的Horn子句求解器,或者您可以使用定点扩展语法,该语法对于声明变量有一些便利。有几个后端。主要是: - 'datalog':基于哈希表的数据记录求解器。关系必须超过有限域变量 - 'pdr':关系必须超过布尔值,算术,位向量和/或代数数据类型。 - 'bmc':有界模型检查对应于过渡关系的喇叭子句的展开。 其他引擎也存在,但这些是主要考虑因素。

SMT-LIB2中HORN子句的语义与SMT-LIB2语义相同。没有特殊的语义,但是Horn求解器只能处理公式的组合 对应于Horn条款。您的示例只能使用Horn子句表示:每个规则都是一个含义,查询对应一个否定子句(否定查询并将其与其他子句一起断言。当得到的子句集是不可分的时,则查询为可行;当得到的子句集合可满足时,则查询是不可行的。)