簡體   English   中英

在z3py中使用BitVec數組時,如何按數組順序檢索得到的解?

[英]How to retrieve the obtained solution in array order when using arrays of BitVec in z3py?

我正在嘗試使用 z3 中的 Array 類型解決問題。 因為我需要使用 BitVec 類型,所以我將數組聲明為:

numbers = [BitVec(chr(i), 8) for i in range(0, 4)]

進而 :

s = Solver()
s.add(numbers[0] == 100)
s.add(numbers[1] == numbers[0] + 2)
s.add(numbers[3] == numbers[1] + numbers[0])
s.add(numbers[2] == numbers[1] - 4)
print(s.check())
print(s.model())

輸出 :

sat
[ = 98,  = 202,  = 102,  = 100]

但是它沒有按順序打印結果,有沒有辦法按順序打印它們?

例子:

[ = 100, = 102, = 98, = 202 ]

我還有一個疑問。 有沒有辦法設置一個數字的頻率限制:

numbers = [BitVec(chr(i), 8) for i in range(0, 4)]

s = Solver()
s.add(numbers[0] == 100)
s.add(numbers[0] + numbers[1] + numbers[2] == 200)
s.add(collections.Counter(numbers)[100] == 1) # something like that
print(s.check())
print(s.model())

要設置該數字,100 必須僅出現在 numbers[0] 中。

對於您的第一個問題,我首先建議為變量提供一些可讀的名稱。 chr(i) for i in range(0, 4)是 4 個不可打印的字符。 最好將chr(i+48)用於數字 0..9 或chr(i+65)用於字母 A..Z

以與數組相同的順序打印結果的最簡單方法是: print ([s.model[n].as_long() for n in numbers])

對於你的第二個問題,我建議使用Z3的Sum函數。 例如:

numbers = [BitVec('N'+chr(i+48), 8) for i in range(0, 4)]
s = Solver()
s.add(numbers[0] == 100)
s.add(numbers[0] + numbers[1] + numbers[2] == 200)
s.add(Sum([If(n == 100, 1, 0) for n in numbers]) == 1)
print(s.check())
m = s.model()
print (m)
print ([m[n].as_long() for n in numbers])

哪些輸出(在我的測試用例中):

sat
[N3 = 116, N1 = 106, N0 = 100, N2 = 250]
[100, 106, 250, 116]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM