【问题标题】:Constrain variable to be in array将变量约束在数组中
【发布时间】:2019-01-22 08:04:33
【问题描述】:

我正在解决的问题涉及确保某些变量是完美的正方形。

据我了解,z3 中还没有对 sqrt 的原生支持。我的想法是简单地使用第一个说 300 个方格的数组并检查是否包含变量。我该怎么办?

坦率地说,由于我对 z3 不是非常精通,因此对于如何解决问题可能会有更好的建议,对任何事情都开放!

【问题讨论】:

    标签: arrays z3


    【解决方案1】:

    如果不确切知道您要做什么,很难在这里提出好的建议。但是,也许您不需要sqrt?如果你想要的只是完全平方的数字,那么你可以反过来:

    (declare-fun sqrtx () Int)
    (declare-fun x     () Int)
    
    ; this will make sure x is a perfect square:
    (assert (and (>= sqrtx 0) (= x (* sqrtx sqrtx))))
    
    ; make it interesting:
    (assert (> x 10))
    
    (check-sat)
    (get-value (x sqrtx))
    

    打印出来:

    sat
    ((x 16)
     (sqrtx 4))
    

    本质上,对于您想要的每个“完美正方形”,您都可以声明一个幽灵变量并断言所需的关系。

    请注意,这会导致非线性(因为您将两个符号值相乘),因此求解器可能很难处理您的所有约束。但是在没有看到你真正想要做什么的情况下,我认为这将是获得完美平方并与之推理的最简单方法。

    【讨论】:

    • 我使用了你的方法,但是得到一个“不完整的理论算术”异常(见代码here)知道为什么吗?
    • 不幸的是,您遇到了我所说的“非线性”。 SMT 求解器不擅长解决非线性整数问题,其中您将两个符号整数值相乘。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多