关于在CLP中求解整数约束的问题

时间:2017-08-29 12:12:40

标签: prolog clpfd

我正在研究有限集理论的约束求解器,称为{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系统实施:

  • 一些线性整数规划算法,用于求解线性等式和不等式的系统;和/或

  • 求解线性丢番图方程组的一些方法

一切顺利,   全型

1 个答案:

答案 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,它是一致的,完整的,也是可判定的。