是否有任何函数可用于计算Z3 / cvc4中基数2的对数?

时间:2014-10-28 12:03:41

标签: z3 cvc4

我想证明一个简化,它涉及计算基数2的日志。在z3 / cvc4中有没有可用于计算它的函数?

2 个答案:

答案 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给出的线性编码。