Z3中的不动点

Z3中的不动点,z3,datalog,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

有人能指出为什么最终查询没有输出吗

基本上我告诉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))

这个例子揭示了一些事情。我会试着去看这些

  • 查询返回“sat”或“unsat”。在“sat”情况下,有一组元组对应于查询中的自由变量,因此查询是可派生的。要打印这些元组,可以指定“:print answer true”作为选项
  • 您的特定查询不包含任何自由变量,因此没有要打印的元组
  • 我添加了另一个包含自由变量的示例,Z3打印了一个解决方案
  • 数据日志引擎并不真正支持无限域。您应该使用布尔值、位向量或有限域值(用于以数据日志格式输入的程序的特殊排序)上的关系。我已将您的示例更改为使用位向量
  • (设置选项:fixedpoint.engine数据日志)
    (定义排序站点()(u-BitVec 3))
    (定义sort Loc()(u-BitVec 8))
    (向(Loc现场)申报相关点)
    (声明相关数据调用(Loc Loc))
    (声明rel派生(现场))
    (声明var vs Loc)
    (声明var vd Loc)
    (申报var ss站点)
    (声明var sd站点)
    ;;;;; 衍生工具的定义;;
    (规则(=>(和(dcall vs vd)(pointsto vs ss)(pointsto vd sd))(派生ss sd)))
    (规则(dcall(bv11 8)(bv12 8)))
    (规则(指向(bv11 8)#b001))
    (规则(指向(bv12 8)#b010))
    (查询(派生的#b001#b010)
    :打印答案(正确)
    (查询(派生的#b001 ss)
    
    :print answer true)
    语法似乎有误。为什么要写点到(vs ss)而不是(点到vs ss)?对不起。打字错误。现在更正。但仍然没有结果显示。通过在本地Z3而不是rise4fun上运行,我发现“libc++abi.dylib:以std::bad_cast:std::bad_cast类型的未捕获异常终止”