【发布时间】:2021-07-10 05:11:08
【问题描述】:
假设我有两个变量 a 和 b。我想在它们之间定义以下关系/约束:
- a = 1,b % 12 = 1 或 b % 12 = 0
- a = 2, b % 12 = 0
一些解决方案是
- a = 1,b = 1
- a = 1,b = 12
- a = 2,b = 12
我目前正在以一种简单的方式对此进行建模(并在顶部添加一个额外的条件):
rhs = Or(
And(a == 1, Or(b % 12 == 1, b % 12 == 0)),
And(a == 2, Or(b % 12 == 0))
)
lhs = And(b > 10)
solver.add(Implies(lhs, rhs))
但是,随着我增加变量和约束的数量,这会变得非常慢。
有没有更好的建模方法?也许是一个功能?但我希望允许搜索“双向”运行,即给定 b 的值,我们应该能够识别 a 的值,反之亦然。
【问题讨论】:
-
除法和模数对于 SMT 求解器来说总是很困难。可能有更好的编码,但如果不看到更多细节就很难说。如果您清楚自己要在高层次上解决什么问题,则堆栈溢出效果最好,因此此处需要更多详细信息以获得更好的答案。另外,请注意 XY 问题:en.wikipedia.org/wiki/XY_problem.
-
感谢您的回复。我本质上是在尝试使用 Z3 作为约束求解器。这个特殊的问题是一个音乐 CSP,所以 a 是一个和弦,b 是一个音符,它们相互约束。模数归一化八度音阶,例如对于某些和弦,我们可以有音符 i 或 i+12(一个八度音程)或 i+24 等。我还尝试用所有可能音符的析取替换模数,但这并没有更快。