Z3中的位向量-不同位的函数

Z3中的位向量-不同位的函数,z3,smt,Z3,Smt,我有这段代码来检查其他元素是否包含在集合中 ;; All is encoding the set that contains {0, 1, 2, 3, 4, 5} (define-const All (_ BitVec 6) #b111111) ;; Empty is encoding the empty set (define-const Empty (_ BitVec 6) #b000000) (define-fun LT_l ((S (_ BitVec 6)) (l (_ BitVec

我有这段代码来检查其他元素是否包含在集合中

;; All is encoding the set that contains {0, 1, 2, 3, 4, 5}
(define-const All (_ BitVec 6) #b111111)
;; Empty is encoding the empty set
(define-const Empty (_ BitVec 6) #b000000)

(define-fun LT_l ((S (_ BitVec 6)) (l (_ BitVec 6))) Bool
    ;; True if for all x in S x < l
    (= (bvand (bvshl All l) S) Empty))

(define-fun GT_l ((l (_ BitVec 6)) (S (_ BitVec 6))) Bool
    ;; True if for all x in S l < x
    (= (bvand (bvnot (bvshl All l)) S) Empty))

(define-fun is_in ((e (_ BitVec 6)) (S (_ BitVec 6))) Bool
   ;; True if e is an element of the "set" S.
   (not (= (bvand (bvshl (_ bv1 6) e) S) Empty)))

(define-fun is_minimal ((e (_ BitVec 6)) (S (_ BitVec 6))) Bool
    (and (is_in e S)
         (= (bvand (bvsub (bvshl (_ bv1 6) e) (_ bv1 6)) S) Empty)))

(define-fun LT ((L0 (_ BitVec 6)) (L1 (_ BitVec 6))) Bool
    ; True if forall x in L0 and forall y in L1, x < y
    (or (= L0 Empty)
        (= L1 Empty)
        (exists ((min (_ BitVec 6))) (and (is_minimal min L1) (LT_l L0 min)))))


(declare-const consoleLock (_ BitVec 6))
(declare-const l1 (_ BitVec 6))
(declare-const l2 (_ BitVec 6)) 

( assert (distinct consoleLock l1 l2 ) )

( assert (or (= l1 (_ bv0 6)) (= l1 (_ bv1 6)) (= l1 (_ bv2 6)) (= l1 (_ bv4 6)) ))
( assert (or (= l2 (_ bv0 6)) (= l2 (_ bv1 6)) (= l2 (_ bv2 6)) (= l2 (_ bv4 6)) ))
( assert (or (= consoleLock (_ bv0 6)) (= consoleLock (_ bv1 6)) (= consoleLock (_ bv2 6)) (= consoleLock (_ bv4 6)) ))


(declare-const L4 (_ BitVec 6))
(declare-const L1 (_ BitVec 6))
(declare-const L0 (_ BitVec 6))
(declare-const L5 (_ BitVec 6))


(assert (LT_l L0 l1))
(assert (LT L0 L1))
(assert (GT_l L1 l1))

(assert (LT_l L4 l2))
(assert (LT L4 L5))
(assert (GT_l L5 l2))

(declare-const T1 (_ BitVec 6))
(assert (= T1 l1))
(assert (LT_l T1 l2))

(declare-const T2 (_ BitVec 6))
(assert (= T2 l2))
(assert (LT_l T2 l1))

(check-sat)
(get-model)
;;All对包含{0,1,2,3,4,5}的集合进行编码
(定义常量All(u位向量6)#b111111)
;; Empty是对空集进行编码
(定义常量为空(u位向量6)#b000000)
(定义fun LT_l((S(u位向量6))(l(u位向量6)))Bool
;如果S x
我的问题是,你想把这段代码也用于8位和16位的向量,但它不起作用

例如,如果我将所有(BitVec 6)替换为(BitVec 8),则上面的代码不起作用,因为结果应该是unsat,但它是sat

似乎6位向量工作得很好


如何使其适用于不同大小的位向量?

我们还必须调整示例中出现的常数:
b111111
b000000
(\uBV1 6)
,等等。也就是说,SMT-LIB 2.0格式对于编写参数问题不是很方便。我认为编程API更容易用于编码参数化问题。 下面是使用Z3 Python API编码的相同示例。它也可以在网上获得。我们可以通过将
SZ=6
替换为
SZ=8
SZ=16
来更改位向量的大小

def All(sz):
返回BitVecVal(2**sz-1,sz)
def空(sz):
返回BitVecVal(0,sz)
定义LT_l(S,l):
sz=S.尺寸()

返回(全部)(SZ)谢谢。SMT-LIB 2格式写参数问题不是很方便,但是没有PHYTY,可能只有SMT-LIB 2格式。如果可能的话,我怎么办?我们不能在SMT-LIB 2中做。注意,Z3有其他编程语言的绑定(例如,C,C++,爪哇,C等)。。因此,您可以将python代码移植到这些编程语言中的任何一种。另一种选择是编写一个程序来生成SMT-LIB 2.0文件。给定一个输入N,该程序将为大小为N的位向量生成一个SMT文件。好的,我尝试了第二种选择,但我上面发布的Z3代码并不适用于所有大小,即使只是更改通过(uu-BitVec 8)对(u-BitVec 6)、通过(b111111)和通过(b0000000)对(u-BitVec 6)、通过(b111111)和(b00000)。即使如此,这也是不可能的?它应该可以工作。问题是什么?你能为大小为8的位向量生成的文件提供一个链接吗?例如,对于16位向量,它不工作。它也可以在线获得。因为结果应该是unsat。