CLP:对结构变量的约束?

CLP: Constraints on structured variables?

让我们假设以下场景……一个 5x5 的网格,假设有 3 个数字。 我们想定义对职位的约束。在 CLP 中,我们通常用整数定义约束,所以这是一种实现方式:

  ... Fig1X #\= 2, Fig1Y #\= 3, ....

即我们为每个 X 和 Y 位置都有单独的变量。有没有一种方法可以定义基于整数的结构化变量的约束。举个例子:

 .... Fig1 #\= (2,4) ...

场景仅供参考。

我主要对你们如何处理结构化变量感兴趣,是否有标准做法。

在像您这样的情况下,"structured variables" 具有仅包含数字字段的固定结构,您不需要 "structured variable" 的概念。您在概念上只使用数字元组(或数字变量)。

有时这些元组最好表示为列表,因为这样您就可以直接应用将列表作为参数的全局约束。例如,要限制点 [X,Y] 不在对角线上,您可以写

alldifferent([X,Y])

或使用 table-constraint 将其约束到给定的一组坐标:

table([[X,Y]], [[1,2],[2,4],[3,1],[4,3]])

在其他情况下,最好使用 structures 和描述性仿函数,例如 point(X,Y)rect(X1,Y1,X2,Y2),然后编写相应的约束包装器,例如作为

points_differ(point(X,Y), point(V,W)) :-
    X#\=V or Y#\=W.

rect_contains_point(rect(I,J,K,L), point(PI,PJ)) :-
    I #=< PI, PI #=< K,
    J #=< PJ, PJ #=< L.

(后例取自http://eclipseclp.org/examples/shikaku.ecl.txt)

特别是与您示例中的几何任务相关的问题,至少有以下完全不同的概念方法:

  1. geost/N:这些约束提供了一个专用的 mini-language 用于推理 multi-dimensional 对象。这是一种非常强大和灵活的方法,可用于 SICStus Prolog 以及其他一些约束系统。
  2. 具体化约束。例如,您可以声明 X #= 2 #==> Y #\= 4 来表示如果 X 等于 2,Y 一定不能 为 4。因此,(X,Y) 自动不同于 (2,4).
  3. extensional constraints(在许多 Prolog 系统中可用作 table/2fd_relation/2 等)让您 明确地 枚举可接受的元组集或其补充。
  4. 重塑你的任务是通过布尔指标在允许的位置之间进行选择。有关此方法的示例,请参阅 Packing Squares

这些方法会带来不同的后果 trade-offs。以上顺序大致反映了我个人的喜好和建议。但是,根据手头的情况,一种方法可能比其他方法有显着优势。

CSP 中的建模部分有时被称为一门艺术而不是一门科学,这也是因为有太多不同的可能性可供选择,并且先验地不清楚哪种模型最好也因为有太多许多 trade-offs——例如便利性、便携性、可扩展性、速度、内存等——都涉及。