簡體   English   中英

如何在 PySMT 中使用數組?

[英]How to use array in PySMT?

我對 PySMT 有問題。 我是該領域的新手,不知道如何使用數組。

我已經明白了:

1) 可以將數組聲明為:

a = Symbol("a", ArrayType(INT, INT))

2) 然后,將值存儲在數組中:

k = Store(a, Int(0), int(5))

3)最后,要檢索值:

print(simplify(k).arg(2))

我不知道是否有更好的方法來做到這一點,我也會感謝一些關於此的反饋。

現在,真正的問題是:我可以在 for 循環內的數組中附加值嗎? 例如,是否可能有類似的東西:

for i in range(10):
    Store(a, Int(i), Int(i*2))

這里的問題是要檢索保存的值,我需要將“存儲”操作保存在變量中(如上面的“k”)。 我很確定應該存在某種方式來做到這一點......但是在網上找到例子太難了!

我認為混淆可能源於 Store 和 Select 作為具有副作用的方法與表達式之間的差異。

當您執行以下操作時: Store(a, Int(i), Int(i*2)) ,您正在構建一個表達式來表示執行存儲的結果。 因此,正如@alias 所建議的,您需要繼續構建相同的表達式。

我認為您可能會遇到與Select類似的問題。 如果您執行s = Select(a, Int(0)) ,則您正在構建一個表達式,而不是一個值。 如果a的值定義為索引 0,則您應該能夠執行s.simplify()並獲得該值。

在上面的示例中,您應該可以簡單地替換步驟 3):

simplify(Select(k, Int(0))) # Int(5)

編輯:以下討論后的完整示例

from pysmt.shortcuts import Symbol, Store, Select, Int, get_model
from pysmt.typing import ArrayType, INT

a = Symbol("a", ArrayType(INT, INT))

for i in range(10):
    a = Store(a, Int(i), Int(i*2))

print(a.serialize())
# >>> a[0 := 0][1 := 2][2 := 4][3 := 6][4 := 8][5 := 10][6 := 12][7 := 14][8 := 16][9 := 18]

# x is the expression resulting from reading element 5
# Simplify does not manage to infer that the value should be 10
x = Select(a, Int(5))
print(x.simplify().serialize())
# >>> a[0 := 0][1 := 2][2 := 4][3 := 6][4 := 8][5 := 10][6 := 12][7 := 14][8 := 16][9 := 18][5]

# Ask the solver for a value:
# Note that we can only assert Boolean expressions, and not theory expressions, so we write a trivial expression a = a  
m = get_model(a.Equals(a))

# Evaluate the expression x within the model
print(m[x])
# >>> 10

暫無
暫無

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

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