如何将公式简化为True或False?

时间:2014-05-28 10:11:09

标签: z3 z3py

是否可以在Z3中禁用布尔表达式的自动简化?

例如,表达式2> 1自动变为True,而我希望它保持2> 1:

>>> t = 2 > 1
>>> t
True

我通过在Z3Py中调用help_simplify()找到了几个选项。但是,它们似乎都与我的问题无关。

在另一个教程(http://citeseerx.ist.psu.edu/viewdoc/download?rep=rep1&type=pdf&doi=10.1.1.225.8231)中,选项" CONTEXT SIMPLIFIER"提到:"此设置可用于将子公式简化为真或假。"但是,我在Z3Py中找不到这个选项。

背景:我希望能够使用像And(2> 1,1!= 2)这样的表达式,其中2> 1和1!= 2是先前自动生成的,有时不包含变量(常量)。 Z3Py将此简化为And(True,False),这是不被接受的,因为"至少有一个参数必须是Z3表达式或探针"。因此,我想压制简化。或者有没有办法让And(True,False)成为一个公认的表达方式?

提前致谢!

1 个答案:

答案 0 :(得分:1)

实际上,这是因为Python将简单的表达式(如2> 1)简化为True / False。大多数运营商(如Implies,Xor,......)对此都很好,但And和Or运营商却没有。它们具有不同的实现,因为它们可以用于探测器和表达式。我现在添加了一些代码,使它们像其他布尔运算符一样(对于修复,请参阅here)。我希望这可以解决这个问题,同时不会引入任何新的探针问题。如果其他人可以再试一次,我将不胜感激。