计算Z3中位向量的最小值
我有以下代码: (声明常量L4(u位向量6)) (声明常量L1(u位向量6)) (声明常量L0(ubitvec 6)) (声明常量l2(u位向量6)) 而不是b001000,因为L1的最小值是这个,而不是b000011 有人能给我解释一下吗 最后,我定义了函数Lt_l来检查sx计算Z3中位向量的最小值,z3,smt,Z3,Smt,我有以下代码: (声明常量L4(u位向量6)) (声明常量L1(u位向量6)) (声明常量L0(ubitvec 6)) (声明常量l2(u位向量6)) 而不是b001000,因为L1的最小值是这个,而不是b000011 有人能给我解释一下吗 最后,我定义了函数Lt_l来检查sx
(define-fun GT_l ((S (_ BitVec 6)) (l (_ BitVec 6))) Bool
(= (bvand (bvneg (bvshl (_ bv0 6) l)) S) Empty))
但这不起作用为什么
感谢您在示例中使用位向量表示集合。例如,位向量
#b101000
表示集合{5,3}
。输出(define fun L1()(u-BitVec 6)#b001000)
本质上是说L1
是“集合”{3}
。一个可能的混淆是位向量被用来表示集合和元素。位向量min!0表示一个元素。输出(define fun min!0()(u-BitVec 6)#b00011)
表示min!0
是值3
,它确实是L1
中的“最小值”为什么我这样做(简化(LT_l(bv3 6)(bv2 6))
结果是真的而不是假的?For 3大于2且不小于。为什么会发生这种情况?在(LT_l S l)
中,第一个元素编码一个“集合”(bv3 6)
是二进制的000011
,并且正在对集合{0,1}
进行编码。此“集合”的每个元素都小于2
。这就是为什么结果是正确的。
(define-fun min!0 () (_ BitVec 6)
#b000011)
(define-fun GT_l ((S (_ BitVec 6)) (l (_ BitVec 6))) Bool
(= (bvand (bvneg (bvshl (_ bv0 6) l)) S) Empty))