我正在研究的问题涉及确保某些变量是完美的平方。
据我了解,z3中还没有对sqrt的本地支持(尚未)。我的想法是简单地使用第一个300平方的数组,然后检查是否包含变量。我该怎么办?
坦白说,由于我对z3并不十分精通,因此对于如何解决该问题,可能会有更好的建议!
答案 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))
实质上,对于每个所需的“完美平方”,您都可以声明一个虚变量并声明所需的关系。
请注意,这会引起非线性(因为您要将两个符号值相乘),因此求解器可能很难处理所有约束。但是,如果没有看到您实际要做什么,我认为这将是拥有完美平方并对其进行推理的最简单方法。