我正在研究有限集理论的约束求解器,称为{log}('setlog')。由于某些原因,{log}公式允许整数约束。到目前为止,{log}依赖于CLP(FD)来解决这些约束。但是,我们需要更多;特别是,我们需要摆脱所有整数变量的有限域绑定。换句话说,我们需要一些CLP系统对整数进行更抽象的推理。
我们正在尝试CLP(Q,R)。它带有这个bb_inf / 4谓词,它可以搜索线性等式和不等式系统的整数解。这没关系,但还不完整。例如,它无法为以下系统找到正确的答案:
3 * X + 5 * Y + 6 * Z = 6
X + 3 * Y - 2 * Z = 5
其中X,Y和Z是整数变量。该系统没有整数解,尽管它有无数的有理/实数解。另一方面,CLP(Q,R)找到该系统的正确答案(除了在第一个等式中7代替6之外,它等于上面的那个):
3 * X + 5 * Y + 6 * Z = 7
X + 3 * Y - 2 * Z = 5
这个系统有无限多个整数解。
然后,我们想知道是否有CLP系统实施:
一些线性整数规划算法,用于求解线性等式和不等式的系统;和/或
求解线性丢番图方程组的一些方法
一切顺利, 全型
答案 0 :(得分:3)
CLP(FD)和CLP(Z)约束通过约束传播来工作。这与单纯形法和应用于CLP(Q)的其他方法略有不同。
就CLP(Z)而言,我们面临的情况是Matiyasevich's theorem我们知道没有传播机制可能完成感觉它:
出于这个原因,CLP(Z)系统被称为不完整:您需要一个明确的搜索来寻找解决方案。
好消息是你当然可以进行搜索!但是,如果搜索空间为 finite ,则CLP(Z)仅允许您开始搜索。因此,如果您正在寻找具体的解决方案,一种策略是使用迭代深化,您尝试越来越大的间隔。例如:
?- 3*X + 5*Y + 6*Z #= T, T #= 7*X + 3*Y - 2*Z, T #= 5, Vs = [X,Y,Z], length(_, Upper), Lower #= -Upper, Vs ins Lower..Upper, label(Vs).
前三行是您示例中的等式。查询的其余部分执行搜索,使用越来越大但总是有限的间隔,从0..0,-1..1,-2..2等开始回溯。这是完整的搜索策略,缺点是它可能无法终止。
这是一个具体的解决方案:
X = Z, Z = -5, Y = Upper, Upper = 10, T = 5, Vs = [-5, 10, -5], Lower = -10 ;
您可以将/api/v2/users.json?role[]=admin&role[]=end-user
追加到强制回溯的查询中,并产生:
[-5, 10, -5]. [-5, 10, -5]. [-5, 10, -5]. [-5, 10, -5]. [-5, 10, -5]. [9, -14, 8].
因此,我们已经找到了两个解决方案。其中一些是冗余的报道。
CLP(Z)可以处理线性等式,不等式以及许多其他类型的约束!请注意,如果没有解决方案,那么这种方法永远不会终止,甚至不会存在。
CLP(Q)(如果你有一个工作的系统)可以用来补充CLP(Z),例如如下:如果CLP(Q)失败,那么你知道Q 因此也不在Z中。
以下是您的评论中的示例:
?- { X > Y, Y > X }. false.
因此我们使用CLP(Q)来证明Z中没有溶液。
所有人都认为,CLP(Z)是解决整数方程式的好方法,但您可能需要将其与更多方法结合起来以充分利用它,例如CLP(Q)和针对特定片段的专门推理。例如,参见Presburger arithmetic,它是一致的,完整的,也是可判定的。