Z3中的固定点

时间:2015-04-19 04:04:35

标签: z3 datalog

有人可以指出最终查询为什么没有输出?

基本上我告诉Z3如果vs-)vd和vs-> ss和vd-> sd,那么sd是从ss派生的。

(set-option :fixedpoint.engine datalog)
(define-sort site () (_ BitVec 3))

(declare-rel pointsto (Int site))
(declare-rel dcall (Int Int))
(declare-rel derived (site site))

(declare-var vs Int)
(declare-var vd Int)
(declare-var ss site)
(declare-var sd site)

;;;;; definition of derived ;;
(rule (=> (and (dcall vs vd) (pointsto vs ss) (pointsto vd sd)) (derived ss sd)))          

(rule (dcall 11 12))
(rule (pointsto 11 #b001))
(rule (pointsto 12 #b010))

(query (derived #b001 #b010))

1 个答案:

答案 0 :(得分:2)

此示例公开了一些内容。我会尝试通过这些。

  1. 查询返回" sat"或"不满"。在" sat"如果有一组元组对应于查询中的自由变量,则查询是可派生的。要打印这些元组,您可以指定":print-answer true"作为一种选择。
  2. 您的特定查询不包含任何自由变量,因此没有要打印的元组。
  3. 我添加了另一个包含自由变量的示例,Z3打印了一个解决方案。
  4. 数据记录引擎并不真正支持无限域。您应该使用关于布尔值,位向量或有限域值的关系(用于以数据记录格式输入的程序的特殊排序)。我已经改变了你的例子来使用位向量。
  5. 
    
    (set-option :fixedpoint.engine datalog)
    (define-sort site () (_ BitVec 3))
    (define-sort Loc () (_ BitVec 8))
    
    (declare-rel pointsto (Loc site))
    (declare-rel dcall (Loc Loc))
    (declare-rel derived (site site))
    
    (declare-var vs Loc)
    (declare-var vd Loc)
    (declare-var ss site)
    (declare-var sd site)
    
    ;;;;; definition of derived ;;
    (rule (=> (and (dcall vs vd) (pointsto vs ss) (pointsto vd sd)) (derived ss sd)))          
    
    (rule (dcall (_ bv11 8) (_ bv12 8)))
    (rule (pointsto (_ bv11 8) #b001))
    (rule (pointsto (_ bv12 8) #b010))
    
    (query (derived #b001 #b010) 
       :print-answer true)
    
    (query (derived #b001 ss) 
       :print-answer true)