约束变量在数组中

Constrain variable to be in array

我正在处理的问题涉及确保某些变量是完全平方数。

据我了解,z3 中(目前)还没有对 sqrt 的原生支持。我的想法是简单地拥有一个包含第一个 300 个正方形的数组,并检查是否包含该变量。我该怎么做?

坦率地说,我对 z3 不是很精通,可能会有更好的建议来解决这个问题,对任何事情都持开放态度!

如果不确切知道您要做什么,就很难在这里提出好的建议。但是,也许您不需要 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))

本质上,对于每个 "perfect-square" 你想要的,你可以声明一个 ghost 变量并断言所需的关系。

请注意,这会产生非线性(因为您要将两个符号值相乘),因此求解器可能很难处理您的所有约束。但是,在没有看到您实际尝试做什么的情况下,我认为这将是获得完美正方形并对其进行推理的最简单方法。