z3的解决方法不支持注入性

时间:2017-09-26 06:05:24

标签: z3

我想在z3中表示一个哈希函数,比如SHA(x)。经过一些研究后,看起来z3不能很好地支持注入性,所以我不能有类似的约束(虽然我发现由于碰撞而严格来说这并不是真的,因为启发式它对我来说很有用项目)

forall([x, y],Implies(SHA(x)==SHA(y), x==y))

并期望解算器终止。

我的问题是,这个问题是否有任何已知的最佳实践解决方法?例如,如果我在不使用量词的情况下为每对x和y添加了Implies(SHA(x)== SHA(y),x == y)约束,那么这会解决问题吗?

1 个答案:

答案 0 :(得分:3)

对于未解释的函数,我们使用以下形式的编码:

Forall([x],inverse_f(f(x))= x)

所以当f是单射时,我们可以引入一个函数来实现f范围的部分逆。具有成对等式的量化公理是如此常见,以至于Z3寻找它们并且添加上述公理。 它会在每次出现f时被实例化。 当然,对于通常使用位向量编码的SHA,引入未解释的函数意味着Z3不使用纯SAT求解器。在最好的情况下,它将恢复为Ackerman编码,只是重新引入原始的成对编码。