如何在 python 中声明具有唯一名称的变量?

How to declare variables with unique name in python?

一个程序收到一个映射 vars,它映射了 pathCons 中变量的名称和类型。现在,我要解决这个path_cons,我设计了下面的parse()函数来尝试实现它。 但是,要使 solver 识别 path_cons 中的所有变量,我必须先声明它们。但是他们的名字被记录到一个变量中,那么我该如何实现我的目标呢?

def parse(vars, pathCons):
    for var in list(vars.keys()):
       if vars[var] == "uint":
           ???(should be name of var) = BitVec(var, 256)
       elif vars[x] == "bool":
           ??? = Bool(var)
   solver.add(eval(path_cons))

我想到了一个想法,我为每个变量随机生成一个唯一的名称,然后用path_cons中的新名称替换它们。但同样,生成的名字也是一个值,不能作为变量的名字。

例如,

vars = {"length":"int", "balance":"uint", "day":"uint", "flag":"bool"}
pathcons = "length>9, ULT(day, 10), UGE(balance + day, 100), flag == true"

现在我收到这两个变量,我想求解pathcons

很难理解您要在此处实现的目标。如果您 post 编码人们可以 运行 并看到您正在 运行 遇到的问题,那么 Stack-overflow 的效果最好。

但在我看来,您想创建一堆与您拥有的某些变量概念相对应的 z3 名称。为此,只需创建一个数组并相应地使用它。我会这样做:

from z3 import *

progVars = {"length":"int", "balance":"uint", "day":"uint", "flag":"bool"}

def mkVar(var):
    if progVars[var] == "uint":
        return BitVec(var, 256)
    elif progVars[var] == "bool":
        return Bool(var)
    elif progVars[var] == "int":
        return Int(var)
    else:
        raise Exception("Don't know how to handle %s" % progVars[var])

z3Vars = [{"progVar": v, "z3Var": mkVar(v)} for v in progVars.keys()]

print(z3Vars)

这会打印:

[{'progVar': 'length', 'z3Var': length}, {'progVar': 'balance', 'z3Var': balance}, {'progVar': 'flag', 'z3Var': flag}, {'progVar': 'day', 'z3Var': day}]

注意我们的字典现在如何通过您的“程序键”进行索引,并且对于每个我们在 z3Var 字段中存储创建的 z3 变量。这些将是真正的符号值,您稍后可以使用 z3 进行操作,添加到带有约束的求解器等。