Z3中的不动点
有人能指出为什么最终查询没有输出吗 基本上我告诉Z3如果vs-)vd和vs->ss和vd->sd,那么sd是从ss派生出来的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
(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))
这个例子揭示了一些事情。我会试着去看这些
(设置选项: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类型的未捕获异常终止”