簡體   English   中英

(z3py) 使用 all_smt 生成二維列表的所有解決方案

[英](z3py) Generate all solutions for a 2D list using all_smt

為了找出 SMT 中生成的所有解決方案,我使用了https://stackoverflow.com/a/70656700/12385200中建議的 all_smt() 方法

但是,這僅適用於一維列表。 如果我們嘗試列出二維列表的解決方案怎么辦?

我得到的一般錯誤是:

'list' object has no attribute 'as_ast'

我試圖從二維列表中分離出每個一維列表,如下所示:

def all_smt(s, initial_terms):
    def block_term(s, m, t):
        s.add(t != m.eval(t, model_completion=True))
    def fix_term(s, m, t):
        s.add(t == m.eval(t, model_completion=True))
    def all_smt_rec(terms):
        for j in range(len(terms)):
            term = terms[j]
            print("term:", term)
            if sat == s.check():
                m = s.model()
                yield m
                for i in range(len(term)):
                    s.push()
                    block_term(s, m, term[i])
                    for j in range(i):
                        fix_term(s, m, term[j])
                    yield from all_smt_rec(term[i:])
                    s.pop()   
    yield from all_smt_rec(list(initial_terms))

但是在一定數量的“條款”之后,我收到object of type 'ArithRef' has no len()

我們如何將 all_smt 用於 2D ArithRef 列表? 更好的是,我們可以將它概括為 nD 列表嗎?

initial_terms應該是一個簡單的術語列表,您不希望在模型中“重復”這些術語。 如果您有 2d(或 nd 表示任何 n),只需在將其傳遞給all_smt之前將其展平。

展平二維列表的一種簡單方法是:

>>> import itertools
>>> list(itertools.chain(*[[1,2,3],[4,5,6],[7,8,9]]))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

如果你有更高的維度,你可以寫一個類似的 function 來相應地壓平它們。

暫無
暫無

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

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