【问题标题】:How to declare variables with unique name in python?如何在python中声明具有唯一名称的变量?
【发布时间】:2021-06-16 17:22:00
【问题描述】:

程序接收到一个映射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

【问题讨论】:

  • “变量变量”的规范等价物是 dictlist 用于命名或枚举变量。同样,eval 可以直接将dict 用于全局/本地。你有什么理由在实际的本地命名空间中尝试eval
  • @MisterMiyagi 据我所知,eval 中的dict 是为eval str 中的变量赋予初始值。但是 z3 求解器仍然需要变量声明。

标签: python-3.x z3 solver


【解决方案1】:

很难理解您在这里想要实现的目标。如果您发布人们可以运行的代码并查看您遇到的问题,则 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}]

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

【讨论】:

  • 感谢您的帮助!它启发了我并完美地解决了我的问题!!!
  • 还有一个问题:假设有一组约束 :x>y && (y>x || y==10 && y>z) ,如何在python中通过z3语法来表达它们,即使用, Or。我认为(x>y, Or(y>x,( y== 10, y>z)) 无法表达他们的本意。
  • 最好分开提问; stack-overflow cmets 旨在针对所设计的特定问题进行简单的交流。话虽如此,在 z3py 中编程时,使用Or 进行析取,And 用于连词,Implies 用于暗示,If 用于一般条件。
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
相关资源
最近更新 更多