【问题标题】:Find possible values查找可能的值
【发布时间】:2026-01-20 06:55:01
【问题描述】:

我要验证表格的公式:

Exists p . ForAll x != 0 . f(x, p) > 0 and g(x, p) < 0

所有变量都是实数。

按照here 的建议,我将此列表添加到求解器中:

[ForAll([x0, x1],
    Implies(Or(x0 != 0, x1 != 0),
        And(P0*x0*x0 + P1*x0*x1 + P2*x0*x1 + P3*x1*x1 > 0,
            -2*P0*x0*x1 + P1*x0*x0 - P1*x0*x1 - P1*x1*x1 + P2*x0*x0 - P2*x0*x1 - P2*x1*x1 + 2*P3*x0*x1 - 2*P3*x1*x1 < 0
            )
        )
    )
]

具有上述公式的求解器返回unsat。一个可能的解决方案是让P 成为[[1.5, -0.5], [-0.5, 1]],事实上,通过替换这些值,公式得到了满足:

And(3/2*x0*x0 - 1*x0*x1 + x1*x1 > 0,
    -1*x0*x0 - 1*x1*x1 < 0)

有没有办法实际计算出这样的p?如果z3很难,有没有办法解决这个问题?

【问题讨论】:

    标签: formula z3 smt z3py


    【解决方案1】:

    当您说“Exists”后跟“Forall”时,您是在说该公式对于每个 x0x1 都应该是正确的。 Z3 告诉你,事实并非如此。

    如果您有兴趣找到一个这样的P 和相应的x 值,只需删除量化并将所有内容都设为*变量:

    from z3 import *
    
    def f(x0, x1, P0, P1, P2, P3):
        return P0*x0*x0 + P1*x0*x1 + P2*x0*x1 + P3*x1*x1
    
    def g(x0, x1, P0, P1, P2, P3):
        return -2*P0*x0*x1 + P1*x0*x0 - P1*x0*x1 - P1*x1*x1 + P2*x0*x0 - P2*x0*x1 - P2*x1*x1 + 2*P3*x0*x1 - 2*P3*x1*x1
    
    p0, p1, p2, p3  = Reals('p0 p1 p2 p3')
    
    x0, x1 = Reals('x0 x1')
    fmls = [Implies(Or(x0 != 0, x1 != 0), And(f(x0, x1, p0, p1, p2, p3) > 0, g(x0, x1, p0, p1, p2, p3) < 0))]
    
    while True:
        s = Solver()
        s.add(fmls)
        res = s.check()
        print res
        if res == sat:
            m = s.model()
            print m
            fmls += [Or(p0 != m[p0], p1 != m[p1])]
        else:
           print "giving up"
           break
    

    当我运行它时,我得到:

    sat
    [x0 = 1/8, p0 = -1/2, p1 = -1/2, x1 = 1/2, p2 = 1, p3 = 1]
    

    还有很多其他的;这就是我相信你所追求的。

    请注意,您还可以根据您所在的位置进行一些编程来摆脱存在量化;即,从量化版本开始,如果您收到unsat,则切换到新的求解器并使用未量化版本来自动化此过程。当然,这只是编程,目前与 z3 没有任何关系。

    【讨论】:

    • 我真的很想找到一个所有非零实数都满足公式的PP 存在,因为第一篇文章中的那个满足所有非零实数的公式
    • 另外,当你说:“Z3 告诉你事实并非如此”,那么 Z3 就错了,因为那个例子。并且引入这些值使得 Z3 的结果是 sat
    • @nyuw 我没有研究这个表达式,但是如果您确实认为 Z3 是错误的,那么这将是一个应该报告的相当严重的错误。 (这是一个健全性问题,开发人员应该知道它!)我鼓励您在他们的问题跟踪器上报告它:github.com/Z3Prover/z3/issues
    • @nyuw 我已经更详细地查看了这些表达式,我认为你是对的,Z3 似乎无缘无故地说unsat。除非有其他问题,否则这很可能是一个错误。请在他们的问题页面上报告。 (或者我也可以这样做,请告诉我。)
    • 我创建了一个问题;如果您认为它写得正确,请告诉我。我也不确定为什么我必须在开头删除Exists 量词(参考我之前的问题);但即使再次添加它,P 的某些值也是错误的(?),或者如果硬编码它们就不起作用(正如我在问题中所说)。告诉我