Python 使用check()检查sat,假设属性错误:';布尔';对象没有属性';如前所述';

Python 使用check()检查sat,假设属性错误:';布尔';对象没有属性';如前所述';,python,z3,Python,Z3,为什么会这样: >>> from z3 import * >>> s = Solver() >>> s.add([True]) >>> s.check() sat 但这并不是: >>> from z3 import * >>> s = Solver() >>> s.check([True]) Traceback (most recent call last): Fi

为什么会这样:

>>> from z3 import *
>>> s = Solver()
>>> s.add([True])
>>> s.check()
sat
但这并不是:

>>> from z3 import *
>>> s = Solver()
>>> s.check([True])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "$HOME/.local/lib/python3.6/site-packages/z3/z3.py", line 6656, in check
    _assumptions[i] = assumptions[i].as_ast()
AttributeError: 'bool' object has no attribute 'as_ast'
>>>
>>从z3导入*
>>>s=解算器()
>>>美国支票([对])
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“$HOME/.local/lib/python3.6/site packages/z3/z3.py”,第6656行,检查
_假设[i]=假设[i]。如
AttributeError:“bool”对象没有“as_ast”属性
>>>
我错过什么了吗?我知道这是相同的操作,但没有将新约束记录到解算器中


我使用的是Z3版本4.8.6-64位

,正如您所指出的,这里没有任何理由对参数进行不同的处理

由于Python的非类型化特性,z3绑定“玩”了一些技巧,通过将它们转换为它可以使用的各种形式来解释您编写的内容。对于
s.add
方法,它们比
s.check()
函数更“灵活”

您可以通过以下方式解决此问题:

>>从z3导入*
>>>s=解算器()
>>>美国支票([Bool(True)])
坐
请注意,这同样适用于
s.add

>>从z3导入*
>>>s=解算器()
>>>s.add([Bool(True)])
>>>打印(s.check())
坐
因此,您可以通过以
add
check
都支持的形式编写布尔文本来实现“一致性”。但理想情况下,这些方法本身在处理术语时应该是统一的。你已经发现了一个案例,它们之间的差异是没有充分理由的


这不一定是Python中典型的“bug”:缺少静态类型迫使库开发人员支持无数的情况,并且在这样的设置中很难保持所有内容的一致性。但它肯定是一个疣。如果它真的给你带来了麻烦,你可以在这里这样报告:看看是否有人对这种不一致性足够关注来解决它。(一个修复它的请求很可能会被感激,代码是。)

解决了我的问题,对我来说,将它转换为Bool并不是一个真正的问题。我对z3有点陌生,但也许我可以看看代码。我做了一个拉请求来修复它,现在合并到master。太棒了!很好的贡献。