让我们具有以下假设的情况...一个带有5x5的网格,假设3个数字。我们想定义位置的约束。在CLP中,我们通常通过整数定义约束,因此这是一种方法:
... Fig1X #= 2, Fig1Y #= 3, ....
即。我们每个X和Y位置都有单独的变量。是否有一种方法可以定义在整数顶部构建的结构化变量的约束。为了示例:
.... Fig1 #= (2,4) ...
场景仅用于插图。
我主要对您如何处理结构化变量,是否有标准实践感兴趣。
,尤其是与示例中的几何任务有关,至少有以下完全不同的概念方法:
-
geost/N
:这些约束提供了用于推理多维对象的专用迷你语言。这是一种非常有力和灵活的方法,在Sicstus  Prolog中以及其他一些约束中都可以使用。
。 - REFIFIED 约束。例如,您可以陈述
X #= 2 #==> Y #= 4
表示Y
必须  be 4,如果X
等于2。因此,(X,Y)
自动与(2,4)
不同。 - 扩展约束(在许多prolog 系统中以
table/2
,fd_relation/2
等提供(让您明确 - 重建您的任务是通过布尔值  em>指示器在可允许的位置之间进行选择的。有关此方法的示例,请参见包装方形。
这些方法带来了不同的后果和权衡。我个人的喜好和建议大致反映在上述订单中。但是,根据AT 手的情况,一种方法可能比其他方法具有显着优势。
CSP中的建模部分有时被称为艺术,而不是A  Science也是因为有很多不同的可能性可以从中选择&nbsp',而且尚不清楚哪种模型也是最好的,因为还有最好的nbsp;如此多的权衡,例如便利性,可移植性,可扩展性,速度,内存等等。
在像您这样的情况下,"结构化变量"具有仅包含数字字段的固定结构,您不需要"结构化变量"的概念。从概念上讲,您只是与数字(或数字变量(的元素一起工作。
有时这些元组最好用作 lists ,因为您可以直接应用将列表作为参数的全局约束。例如,为了限制一个 [X,Y]
不要在对角线上,您可以写
alldifferent([X,Y])
或使用表限制将其限制为给定的坐标集:
table([[X,Y]], [[1,2],[2,4],[3,1],[4,3]])
在其他情况下,使用结构与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(