计算Z3中位向量的最小值

计算Z3中位向量的最小值,z3,smt,Z3,Smt,我有以下代码: (声明常量L4(u位向量6)) (声明常量L1(u位向量6)) (声明常量L0(ubitvec 6)) (声明常量l2(u位向量6)) 而不是b001000,因为L1的最小值是这个,而不是b000011 有人能给我解释一下吗 最后,我定义了函数Lt_l来检查sx

我有以下代码: (声明常量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))