[英]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.