【发布时间】:2021-11-15 15:05:25
【问题描述】:
我有两个大型 Z3 整数变量集合。将它们称为集合 A 和集合 B。 (组成员资格是预先知道的,因此不需要使用 Z3 集合。)我需要生成断言,以确保 A 中的任何元素都不会等于 B 中的元素.显而易见的方法如下:
for all a in A:
for all b in B:
solver.add(a != b);
但是,集合很大,这会增加超过 2000 万个断言,所以这不是一个选择。
这是我想出的另一种方法,它只涉及断言总共 O(n+m) 个子句:
a = ctx.int_const("a");
a_def = (a == A[0] || a == A[1] || ... || A[n]);
b = ctx.int_const("b");
b_def = (b == B[0] || b == B[1] || ... || B[m]);
solver.add(z3::forall(a, b, z3::implies(a_def && b_def, a != b)));
有没有更有效的方法来做到这一点?似乎上述方法以间接方式将 A 和 B 之间的关系呈现给求解器,我担心这会损害性能。
【问题讨论】: