z3py将数据类型/枚举与字符串进行比较

时间:2017-08-15 14:14:58

标签: python enums z3 z3py

按照此示例(位于此处z3py),我可以将c与例如Color.green进行比较。 Color = Datatype('Color') Color.declare('red') Color.declare('green') Color.declare('blue') Color = Color.create() # Let c be a constant of sort Color c = Const('c', Color) # Then, c must be red, green or blue prove(Or(c == Color.green, c == Color.blue, c == Color.red))

c

在我的应用程序中,我必须将c = Const('c', Color) solve(c == "green") # this doesn't work, but it works with Color.green 与python-string进行比较: 我想要这样的东西:

IntSort

该方法有效,例如对于i = Int("i") solve(i < 10) (见下文),但不适用于我自己的数据类型。

keySet()

2 个答案:

答案 0 :(得分:1)

Z3 python接口对字符串进行非常有限的重载。您可以将字符串文字用于类型&#39; String&#39;。否则字符串不会被强制转换为其他类型。此外,使用字符串的方法对整数也不起作用,例如

 I = Int("I") 
 solve(I < "10")

会抛出错误。

请注意,您可以使用Color.red或声明自己的简写:

red = Color.red

答案 1 :(得分:1)

一个对我有用的解决方案(将数据类型/枚举与字符串进行比较)是在cast中向class DatatypeSortRef(SortRef)添加z3.py例程。 它将尝试查找与给定字符串匹配的构造函数并使用它,否则继续使用现有行为(super().cast(val)

以下是我使用的代码:

def cast(self, val):
    """This is so we can cast a string to a Z3 DatatypeRef. This is useful if we want to compare strings with a Datatype/Enum to a String.

    >>> Color = Datatype("Color")
    >>> Color.declare("red")
    >>> Color.declare("green")
    >>> Color.declare("blue")
    >>> Color = Color.create()

    >>> x = Const("x", Color)
    >>> solve(x != "red", x != "blue")
    [x = green]
    """
    if type(val) == str:
        for i in range(self.num_constructors()):
            if self.constructor(i).name() == val:
                return self.constructor(i)()
    return super().cast(val)

注意:我没注意一般的正确性。这种方法适用于 me ,但可能会导致代码出现问题。