将变量约束为数组

时间:2019-01-22 08:04:33

标签: arrays z3

我正在研究的问题涉及确保某些变量是完美的平方。

据我了解,z3中还没有对sqrt的本地支持(尚未)。我的想法是简单地使用第一个300平方的数组,然后检查是否包含变量。我该怎么办?

坦白说,由于我对z3并不十分精通,因此对于如何解决该问题,可能会有更好的建议!

1 个答案:

答案 0 :(得分: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))

实质上,对于每个所需的“完美平方”,您都可以声明一个虚变量并声明所需的关系。

请注意,这会引起非线性(因为您要将两个符号值相乘),因此求解器可能很难处理所有约束。但是,如果没有看到您实际要做什么,我认为这将是拥有完美平方并对其进行推理的最简单方法。