AUFBV逻辑理论:在Z3模型中以十进制格式获取阵列值
如何在QF_AUFBV逻辑理论中得到整数排序变量的值 考虑SMTLIB2中的以下脚本使用QF_AUFBV逻辑理论AUFBV逻辑理论:在Z3模型中以十进制格式获取阵列值,z3,smt,Z3,Smt,如何在QF_AUFBV逻辑理论中得到整数排序变量的值 考虑SMTLIB2中的以下脚本使用QF_AUFBV逻辑理论 (set-logic QF_AUFBV) (set-option :model_compress false) (declare-fun a () (Array (_ BitVec 32) (_ BitVec 8) ) ) (declare-fun b () (Array (_ BitVec 32) (_ BitVec 8) ) ) (declare-fun out () (Arra
(set-logic QF_AUFBV)
(set-option :model_compress false)
(declare-fun a () (Array (_ BitVec 32) (_ BitVec 8) ) )
(declare-fun b () (Array (_ BitVec 32) (_ BitVec 8) ) )
(declare-fun out () (Array (_ BitVec 32) (_ BitVec 8) ) )
(assert
(= (concat (select out (_ bv3 32) ) (concat (select out (_ bv2 32) ) (concat (select out (_ bv1 32) ) (select out (_ bv0 32) ) ) ) )
;; 10<a is false
(ite (= false (bvslt (_ bv10 32) (concat (select a (_ bv3 32) ) (concat (select a (_ bv2 32) ) (concat (select a (_ bv1 32) ) (select a (_ bv0 32) ) ) ) ) ) )
;;b-15
(bvadd (_ bv4294967281 32) (concat (select b (_ bv3 32) ) (concat (select b (_ bv2 32) ) (concat (select b (_ bv1 32) ) (select b (_ bv0 32) ) ) ) ) )
;;b+15
(bvadd (_ bv15 32) (concat (select b (_ bv3 32) ) (concat (select b (_ bv2 32) ) (concat (select b (_ bv1 32) ) (select b (_ bv0 32) ) ) ) ) ))))
;;out>15
(assert
(bvsgt (concat (select out (_ bv3 32) ) (concat (select out (_ bv2 32) ) (concat (select out (_ bv1 32) ) (select out (_ bv0 32) ) ) ) ) (_ bv15 32)))
(check-sat)
(get-model)
有没有办法以十进制格式打印数组的值?是否可以使用一些C/C++Z3API以十进制格式提取值?
在给定的模型中,array out的值是17,b是32。不太清楚您在问什么。但是我猜你想看到常规十进制的值,而不是默认的十六进制 如果是这样的话,那么唉,没有直接的选项可以使SMTLib输出只使用位向量的小数;因为从字面上看它是模棱两可的,只是为了弄清楚它有多宽。但是,可以指示解算器以所谓的bv格式打印位向量值。简单地说:
z3 pp.bv_literals=false input.smt2
这将按如下方式打印文本:
(_ bv128 8)
读取的方法是类型为8位宽位向量,值为128。我想这更接近你的要求
当然,另一个选项是按照您认为合适的方式对输出进行后期处理;但这是不言而喻的。不太清楚你在问什么。但是我猜你想看到常规十进制的值,而不是默认的十六进制 如果是这样的话,那么唉,没有直接的选项可以使SMTLib输出只使用位向量的小数;因为从字面上看它是模棱两可的,只是为了弄清楚它有多宽。但是,可以指示解算器以所谓的bv格式打印位向量值。简单地说:
z3 pp.bv_literals=false input.smt2
这将按如下方式打印文本:
(_ bv128 8)
读取的方法是类型为8位宽位向量,值为128。我想这更接近你的要求
当然,另一个选项是按照您认为合适的方式对输出进行后期处理;但是这是不言而喻的。有什么方法可以避免(uu-as-array k!2))?直接打印数组值即可。有助于找到解决方案。有没有办法避免(uu作为数组k!2))?直接打印数组值即可。有助于找到解决方案。谢谢,@alias。我已经更新了这个问题,使它变得清晰。此选项以十进制形式每八位打印一次。负值呢?是否有更简单的方法来接收数组的值?有没有办法避免(uu作为数组k!2))?直接打印值就行了。没有“负值”这回事。位向量只是一个位序列。是运算符区分符号。谢谢,@alias。我已经更新了这个问题,使它变得清晰。此选项以十进制形式每八位打印一次。负值呢?是否有更简单的方法来接收数组的值?有没有办法避免(uu作为数组k!2))?直接打印值就行了。没有“负值”这回事。位向量只是一个位序列。是运算符区分符号性。