【问题标题】:z3 Solver solution issuesz3 Solver 解决方案问题
【发布时间】:2014-04-08 21:29:27
【问题描述】:
p = Int('p')
q = Int('q')

s = Solver()
s.add(1<=p<=9, 1<=q<=19, 5<(3*p-4*q)<10)
s.check() 
print s.model()

返回sat,并给出解决方案

[p = 0, q = 0]

不满足约束。如果我删除最终约束,它会返回 满足前两个(平凡)约束的合理对。怎么回事?

在线试用的固定链接:http://rise4fun.com/Z3Py/fk4


编辑:我是 z3 的新手,所以我有可能做错了什么,请告诉我。

【问题讨论】:

    标签: python constraints z3 z3py


    【解决方案1】:

    Z3 不支持使用 Python 的比较链,即 a &lt; b &lt; ca &lt; b and b &lt; c 相同。如果不重载and,则无法使 Z3 支持它,这在 Python 中目前是不可能的。 所以a &lt; b &lt; c应该写成:

    b_ = b
    Z3.And(a < b_, b_ < c)
    

    只计算表达式b 一次。


    s.add 行替换为:

    s.add(1<=p, p<=9, 1<=q, q<=19, 5<(3*p-4*q), (3*p-4*q)<10)
    

    我明白了:

    [p = 6, q = 3]
    

    所以你必须像我在上面为求解器所做的那样将它们分开。


    Python 将1&lt;=p&lt;=9 扩展为1&lt;=p and p&lt;=9,当它被解释为p&lt;=9 因为bool(1 &lt;= p)True,问题中的代码导致解决:

    s.add(p<=9, q<=19, (3*p-4*q)<10)
    

    [p = 0, q = 0] 是其中一种解决方案。

    【讨论】:

    • 是的,我也想通了。这很奇怪,因为他们的文档似乎表明您可以。
    • Santosh:Python 文档建议您可以重载 and,或者 Z3 文档建议它支持它?
    • @ChristophWintersteiger Z3 的文档导致 @santosh.ankr 认为 Z3 支持使用 Python 的比较链,即 a&lt;b&lt;c,但 Z3 不支持,并且没有 Z3 就无法支持它重载 and 目前在 Python 中是不可能的。所以a&lt;b&lt;c必须写成b_ = b/Z3.And(a&lt;b_, b_&lt;c)
    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2013-05-18
    相关资源
    最近更新 更多