【问题标题】:Using sets and SetHasSize on intersections in z3在 z3 的交叉点上使用集合和 SetHasSize
【发布时间】:2020-09-20 21:34:18
【问题描述】:

我一直在尝试列举following problem 的解决方案。我先从简单的方法开始。

下面我有两组大小k,它们之间的交集大小为1,我想看看集合AB的样子:

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 z3py


【解决方案1】:

如果我运行你的程序,我会得到:

WARNING: correct handling of finite domains is TBD
WARNING: correct handling of finite domains is TBD
WARNING: correct handling of finite domains is TBD

在它开始循环之前。这是实现中的一个已知问题:Z3 无法真正处理具有有限域的集合。

唉,用无限域替换它也无济于事。进行此更改:

A, B = Consts('A B', SetSort(IntSort()))

你得到:

unsat

这显然是假的。我强烈怀疑这与以下问题有关:https://github.com/Z3Prover/z3/issues/3854(简而言之,SMTLib 前端不支持set-has-size。无论出于何种原因,他们将其留在了 Python 和 C/C++ 接口中,但显然它并不是真正的功能.)

所以,严格来说,这是一个错误。但更现实的答案是 z3 不再支持set-has-size。您应该在https://github.com/Z3Prover/z3/issues 提出问题,以便作者意识到这个问题,如果它永远不受支持,可能会从 API 中完全删除它。

更新:

截至commit,z3 不再接受set-has-size 谓词;它不再受支持。

【讨论】:

  • 谢谢。我从 Jupyter 笔记本上运行它,并没有注意到 shell 中有警告(在 jupyter web 环境之外)。我看到关于 TBD 的相同警告。
  • 请在他们的跟踪器中提交问题,以便他们知道这一点。顺便说一句,为了在有限域上解决您的原始问题,我只需为集合中的每个元素使用一堆布尔值,然后断言一个关于交叉点的伪布尔常量。我认为这也应该有很好的表现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
相关资源
最近更新 更多