AUFBV逻辑理论:在Z3模型中以十进制格式获取阵列值

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

如何在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 () (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))?直接打印值就行了。没有“负值”这回事。位向量只是一个位序列。是运算符区分符号性。