【发布时间】:2020-09-20 21:34:18
【问题描述】:
我一直在尝试列举following problem 的解决方案。我先从简单的方法开始。
下面我有两组大小k,它们之间的交集大小为1,我想看看集合A和B的样子:
Els, elems = EnumSort('Els',['a1', 'a2', 'a3'])
A, B = Consts('A B', SetSort(Els))
k, c = Ints('k c')
s = Solver()
s.add(SetHasSize(A, k))
s.add(SetHasSize(B, k))
s.add(k == 2, c == 1)
s.add(SetHasSize(SetIntersect(A, B), c))
s.check()
s.model()
这里,解决方案应该是A == ['a1', 'a2'] 和B == ['a2', 'a3'],但没有达到可满足性。
即使是像下面这样的简单任务也会导致执行永无止境:
V, _ = EnumSort('Els',['a1', 'a2', 'a3'])
A = Const('A', SetSort(V))
k = Int('k')
s = SimpleSolver()
s.add(SetHasSize(A, k))
s.add(k == IntVal(2))
s.check()
s.model()
将k == IntVal(2) 更改为k <= IntVal(2) 可以解决问题并返回[A = ∃k!0 : k!0 = a1 ∨ k!0 = a2, k = 2] 作为集合的模型。我不确定是否有更快的方法。
【问题讨论】:
-
这现在被报告为 z3 问题:github.com/Z3Prover/z3/issues/4700