我想证明一个简化,它涉及计算基数2的日志。在z3 / cvc4中有没有可用于计算它的函数?
答案 0 :(得分:4)
简短的回答是,两种工具中的整数都不能直接获得支持。对于无界整数,存在固定常数的预燃指数的决策程序。从这里你可以构造对数函数(反之亦然)。我不是专家,但我的理解是这些都很复杂。有关更多信息:
我不知道这些算法的任何现有实现。
对于有界整数,即[a,b]中的x,其中a和b是数字,没有求解器特定支持,但您可以对此进行建模。首先,创建一个整数排序的skolem常量。然后使用断言强制解释s:
(and (=> (2^0 <= x < 2^1) (= s 0))
(=> (2^1 <= x < 2^2) (= s 1))
...
(=> (2^i <= x < 2^{i+1}) (s = i)) ; for all 2^i in [a,b] and i >= 0.
)
如果x <= 0(我觉得这是合理的),这就不会解释。这是非常不令人满意的,但它是线性的。 (如果有人知道更好的编码,我很乐意了解它!)你也可以使用有界或无界整数的量词对上述公理进行编码。首先使用量词将函数2 ^ i编码为未解释的函数。然后使用2 ^ i函数指定日志函数。这可能会导致求解器返回未知,如果沿着这条路走下去,你可能需要使用量词模块的求解器选项。
对于位向量,您需要确定数字是有符号还是无符号。对于长度为k的无符号值,您可以使用右移来模拟它。
(=> (bvugt x (_ bv0 k))) (= (bvlshr x s) (_ bv1 k))
再次x&lt; = 0(无符号)未被解释。有符号的位向量类似:
(=> (bvsgt x (_ bv0 k))) (= (bvlshr x s) (_ bv1 k))
答案 1 :(得分:2)
Alive确实有一个log2(foo)函数顺便说一句。 它使用类似于Tim给出的线性编码。